如何使用C# Stopwatch 测量微秒级精确度
跟同事讨论到- 用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 测量微秒精确度的资料请关注其它相关文章!