用于.NET环境的时间测试

在.NET环境中,衡量运行完整算法所花费的时间长度,需要考虑很多 需要考虑很多种情况 ,如:程序运行所处的线程以及无用单位收集(GC垃圾回收)。

在程序执行过程中无用单元收集可能发生在任何时候,所以在执行时间测试之前我们需要强制调用无用单元收集器来进行专门的无用单元收集——GC.Collect().

现在没有被引用的堆数据已经被我们强行收集了,但GC什么时候收集完毕的,我们仍然需要知道,因为我们要在GC垃圾回收完毕后执行我们的时间测试,怎么解决呢?存储在堆中的每一个对象都有一个称为finalizer的专门方法。 这个方法是在删除对象之前执行的最后一步。

事实上,我们却无法确定对象的finalizer方法是否真的执行了,但是知道在确定删除对象之前需要执行此对象的finalizer方法。所以为了确信这一点,我们需要用GC.WaitForPendingFinalizers()方法来告诉程序等待堆上对象的所有finalizer方法都运行后在继续。

 

  现在剩下最后一个问题了——采用正确的线程。 在.NET环境中程序运行在被成为“应用程序域”的进程中。这就允许操作系统在同一时间内分开运行每个不同的程序,在进程内程序或程序的一部分是在线程内运行的。操作系统通过线程来分配程序的执行时间。在对程序代码进行时间测试时需要确保正在进行时间测试的代码只在为自身程序分配的程序中,而不在操作系统执行的其他任务里。——.NET框架下通过Process类可以做到这一点。Process类拥有的方法允许选取当前的进程(程序运行其内的进程)、选取程序运行其内的线程、以及选取存储线程开始执行时间的计时器。这些方法中的每一个都可以合并成一个调用,此调用会把它的返回值赋值给一个变量用来存储开始时间(TimeSpan对象)。

         ——> TimeSpan startingTime;

                  startingTime = Process.GetCurrentProcess().Threads[0].UserProcessorTime;

         剩下要做的就是在进行时间测试的代码停止时捕获时间:

         ——>duration= Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(startingTime);

ok,事到如此 ,可以大功告成了,贴出完整代码:

Timing类:

 

程序入口

 

程序运行后截图:(次程序运行效果,由机子配置而定)

 

希望对大家有帮助,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值