c# 时间戳的精度(Datetime.now 与 Stopwatch)
时间:2010-12-23 来源:林博然
先看看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 }
相关阅读 更多 +