反射-效率

写了个小程序想看看反射对于效率的影响。

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毫秒)。 

posted @ 2011-01-27 15:24  生命体验之kevin-Y  阅读(1543)  评论(1编辑  收藏  举报