c# 时间戳的精度(Datetime.now 与 Stopwatch)

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

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

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

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

 

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

 


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

 

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

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

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

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

 

附Stopwatch代码示例:

 

ExpandedBlockStart.gif 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              }

 

 

 

 

转载于:https://www.cnblogs.com/linboran/archive/2010/12/23/1914562.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值