下載app免費領取會員
C# 創建對象可以直接用new,也可以用反射,下面測試一下反射創建的性能如何,
這里可以比較一下,構造方法帶參數和不帶參數的區別。
先創建一個測試類,分為構造函數帶參數和不帶參數,兩種情況來測試
public class Test
{
public string Name { get; set; }
public string Id { get; set; }
public Test(string name, string id)
{
Name = name;
Id = id;
}
//public Test()
//{
// //Name = name;
// //Id = id;
//}
}
要測試的方法有
new
Assembly.CreateInstance
Activator.CreateInstance
ConstructorInfo.Invoke
下面是測試代碼
class Program
{
static void Main(string[] args)
{
int m = 1000000;
int i = 0;
string typeName = typeof(Test).FullName;
Assembly ab = typeof(Test).Assembly;
Type type = typeof(Test);
ConstructorInfo cinfo = type.GetConstructors().First();
object[] ps = new object[] { "name", "id" };
Stopwatch stopWatch = new Stopwatch();
Console.WriteLine("---------------------------------------------");
Console.WriteLine("new");
stopWatch.Start();
Console.WriteLine(stopWatch.ElapsedMilliseconds);
while(i<m)
{
Test t = new Test("name","id");
i++;
}
Console.WriteLine(stopWatch.ElapsedMilliseconds);
stopWatch.Stop();
stopWatch.Reset();
i = 0;
Console.WriteLine("---------------------------------------------");
Console.WriteLine("assembly");
stopWatch.Start();
Console.WriteLine(stopWatch.ElapsedMilliseconds);
while (i < m)
{
Test t = ab.CreateInstance(typeName, false, BindingFlags.Public| BindingFlags.CreateInstance| BindingFlags.Instance, null, ps, null, null) as Test;
//Test t = ab.CreateInstance(typeName) as Test;
i++;
}
Console.WriteLine(stopWatch.ElapsedMilliseconds);
stopWatch.Stop();
stopWatch.Reset();
i = 0;
Console.WriteLine("---------------------------------------------");
Console.WriteLine("Activetor");
stopWatch.Start();
Console.WriteLine(stopWatch.ElapsedMilliseconds);
while (i < m)
{
Test t = Activator.CreateInstance(type,ps) as Test;
i++;
}
Console.WriteLine(stopWatch.ElapsedMilliseconds);
stopWatch.Stop();
stopWatch.Reset();
i = 0;
Console.WriteLine("---------------------------------------------");
Console.WriteLine("ConstructorInfo");
stopWatch.Start();
Console.WriteLine(stopWatch.ElapsedMilliseconds);
while (i < m)
{
Test t = cinfo.Invoke(ps) as Test;
//Test t = cinfo.Invoke(null) as Test;
i++;
}
Console.WriteLine(stopWatch.ElapsedMilliseconds);
Console.ReadLine();
}
}
發現使用Assembly.CreateInstance是最慢的,使用new 是最快的
當構造函數帶參數的時候,ConstructorInfo.Invoke是第二快的
當構造函數不帶參數的時候Activator.CreateInstance是第二快的,
查看Assembly.CreateInstance的源碼,發現他在內部是用Activator.CreateInstance創建的,但是多了一個尋找Type的過程,
似乎尋找Type是一件很耗時間的過程
本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。
推薦專題