反射-效率
写了个小程序想看看反射对于效率的影响。
public class Class1:IClass//IClass是一个接口,只有一个方法int GetResult(int pMax)
{
public int GetResult(int pMax)
{
int result = 0;
for (int i = 0; i < pMax; i++)
result += i;
return result;
}
}
类属于使用ClassLibrary类库。以下是直接调用的代码。
int iMax = int.Parse(this.textBox1.Text);
DateTime start = DateTime.Now;
int result = 0;
for (int i = 0; i < iMax; i++)
{
ClassLibrary.Class1 test = new ClassLibrary.Class1();
result = test.GetResult(100);
}
TimeSpan span = DateTime.Now - start;
Console.WriteLine("共用时{0}毫秒", span.TotalMilliseconds);
iMax达到10万次时,用时
共用时31.25毫秒
共用时31.25毫秒
共用时31.25毫秒
共用时31.25毫秒
共用时15.625毫秒
共用时15.625毫秒
共用时31.25毫秒
共用时31.25毫秒
共用时31.25毫秒
反射调用
int iMax = int.Parse(this.textBox1.Text);
DateTime start = DateTime.Now;
int result = 0;
//A.放这差别不大。
Type type = Type.GetType("ClassLibrary.Class1,ClassLibrary");//A.
for (int i = 0; i < iMax; i++)
{
//B.放在这的话,用时跟直接调用时差别很远
//Type type = Type.GetType("ClassLibrary.Class1,ClassLibrary");//B.
ClassLibrary.IClass test = Activator.CreateInstance(type) as ClassLibrary.IClass;
result = test.GetResult(100);
}
TimeSpan span = DateTime.Now - start;
Console.WriteLine("共用时{0}毫秒", span.TotalMilliseconds);
iMax同样的10万次,测试结果
共用时46.875毫秒
共用时31.25毫秒
共用时31.25毫秒
共用时31.25毫秒
共用时46.875毫秒
共用时31.25毫秒
如果反射调用时,每次都重新加载Type的话(使用B点的代码)用时会大幅增加。
共用时1593.75毫秒
共用时1593.75毫秒
共用时1593.75毫秒
共用时1593.75毫秒
共用时1593.75毫秒
但是,我们细心算算这个大幅增加的情况,10万次的过程,如果我们的程序只需要保证1秒内响应100个处理要求,那完全可以忽然反射对于性能的影响,就算1秒内做1000次上面的反射过程,也只比直接调用多用了不到0.02秒(15毫秒)。