最近做了个反射的项目,在测试性能的时候,习惯性的用了Datetime.now来设置时间戳。在测试大量对象反射时,时间戳的结果让我大吃一惊。见下图:

先看看100*100数量级的结果:

反射的效率大约比直接赋值慢30%。

在看看100*1000数量级的测试结果:

 

奇怪的事情发生了,数量级多了10倍,但反射与手动赋值的效率比却有很大的变化。并且手动赋值(红色线)异常波动频繁,高的时候比反射慢,快的时候几乎为0。这怎么可能呢?

 


后来才意识到,原来是使用了Datetime.now的时间戳导致的,这种低精度时间戳并不适用于此类效率测试。

 

把时间戳更换为高精度的System.Diagnostics.Stopwatch后,再测试下,见下图:

在100*100数量级上,差别不是很明显。但到100*1000的数量级上和刚才的结果就完全不同了。见下图:

这次的结果比例,几乎和100*100的比例相同,并且曲线也较平滑。

由此看来在测试代码效率时,一定要要高精度的Stopwatch时间戳,避免出现误差。

 

附Stopwatch代码示例:

 

Stopwatch示例
 1             System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();  //实例化Stopwatch 
 2             List<string> resultList = new List<string>();
 3             for (int n = 0; n < 100; n++)
 4             {   
 5                 sw.Reset();  //初始化时间戳
 6                 sw.Start();  //启动时间戳
 7                 for (int i = 0; i < 500; i++)
 8                 {
 9                     TransferObjAdapter.ToDtoObject(bkUser);
10 
11                     //ObjectConverter.ToUser(bkUser);
12                 }
13                 sw.Stop();  //停止时间戳
14                 string xmlTime = sw.ElapsedMilliseconds.ToString();  //记录时间长度
15 
16                 sw.Reset();  //再次初始化时间戳
17                 sw.Start();  //启动时间戳
18                 for (int i = 0; i < 500; i++)
19                 {
20                     //TransferObjAdapter.ToDtoObject(bkUser);
21                     ObjectConverter.ToUser(bkUser);
22                 }
23                 sw.Stop();  //停止时间戳
24                 string copyTime = sw.ElapsedMilliseconds.ToString();  //记录时间长度
25 
26                 resultList.Add("|" + (n + 1+ " |" + xmlTime + "|" + copyTime + "|");
27                 
28             }

 

 

 

 

posted on 2010-12-23 10:54  林博然  阅读(7061)  评论(2编辑  收藏  举报