欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何使用C# Stopwatch 测量微秒级精确度

程序员文章站 2022-07-06 17:11:34
跟同事讨论到- 用c# stopwatch 取得效能数值,stopwatch.elapsedmilliseconds 只到毫秒(ms),如果需要更高的时间精确度(微秒μs,甚至奈秒ns),该怎么做?原...

跟同事讨论到- 用c# stopwatch 取得效能数值,stopwatch.elapsedmilliseconds 只到毫秒(ms),如果需要更高的时间精确度(微秒μs,甚至奈秒ns),该怎么做?

原以为要费番功夫,在stackoverlow查到,答案意外地简单。

准备测试程式如下,比较md5 及sha1 计算1mb byte[] 杂凑值所秏费时间:

执行结果如下:

有两个问题,第一是回圈的第一次执行因涉及.net 初始化,耗时会异常偏高(先做sha1 再做md5,就变成第一笔sha1 超过10ms),第二是md5 与sha1 执行时间相近,都是2ms 多,用elapsedmilliseconds 看不出差异。

针对首次数值耗时偏差问题,除了略过第一次数据不计,我想到的另一个解法是在test1()前先跑一次md5.create()完成相关初始化。至于elapsedmilliseconds看不出差异问题,改用elapsedticks是种解法,但要注意,elaspedticks换算成时间单位时,不是除以timespan.tickspermillisecond而是依cpu频率而定,需使用stopwatch.frequency (每秒tick数)。

第二版改用elapsedticks * 1000000f / stopwatch.frequency 计算微秒(microsecond, μs),执行前先md5.create() 暖机。

执行结果的第一次时间偏长问题消失,而也呈现出sha1 比md5 计算耗时的证据。而由数值来看,精确度可到0.1μs = 100ns。

自己计算麻烦了点,stopwatch 有个elapsed 属性,型别为timespan,其中totalmilliseconds 属性精确度即可达到μs 及100ns。请看第三版:

执行结果与第二版相同,但程式更简单一些。

以上就是如何使用c# stopwatch 测量微秒精确度的详细内容,更多关于c# stopwatch 测量微秒精确度的资料请关注其它相关文章!