RDTSC与StopWatch

时间:2011-01-19 16:18:36

标签: c#

我编写了自己的字符串匹配算法,我想准确地测量它的时间, 将它与其他算法进行比较,以检查我的实现是否更好。

我尝试过(StopWatch),但是由于Windows操作系统的多个进程运行,它在每次运行中都会给出不同的时间。我听说(RDTSC)可以得到数量 消耗的周期,但我不知道它是否在每次执行中给出不同的周期数?

请帮帮我; Can(RDTSC)可以为C#函数提供准确且相同的周期测量,或者它类似于(StopWatch)?在没有其他正在运行的进程的情况下,哪个是单独获取C#函数的循环数的最佳方法?并且非常感谢任何帮助或暗示

2 个答案:

答案 0 :(得分:4)

  

由于Windows操作系统的多个进程正在运行,因此每次运行都会有不同的时间。

这属于所有基准的性质。

良好的基准测试通过统计方法抵消了这一点,即经常测量以抵消来自其他正在运行的程序的任何副作用。 这个是要走的路。就精确度而言,StopWatch对于基准测试来说已经足够了。

这需要几件事情(没有进入统计细节,我也不太擅长):

  1. 个人应该持续足够长的时间来抵消测量方法引入的测量不精确度(即使RDTSC不完全精确),也可以抵消呼叫开销。毕竟,您想要测量算法,而不是运行测试循环和调用测试方法所需的时间。
  2. 足够的测试运行对结果有信心:数据越多,统计数据的稳健性就越高。
  3. 尽量减少外部影响,尤其是系统性偏见。也就是说,在相同条件下在同一台机器上运行所有测试,否则无法比较结果。完全没有。 此外,如果你运行多次测试运行(你应该!)交错使用不同的方法。

答案 1 :(得分:0)

我认为你应该使用GetThreadTimes()来获得最准确的信息: http://msdn.microsoft.com/en-us/library/ms683237%28v=vs.85%29.aspx 在链接中有用于在C#中使用该功能的签名。