用于测量操作时间的最合适的性能计数器类型是什么?

时间:2009-12-10 08:00:14

标签: .net performance performancecounter diagnostics perfmon

假设我有一个方法Foo(),我想测量执行哪种类型的Windows性能计数器所需的时间(以毫秒为单位)?

var stopwatch = new Stopwatch();
stopwatch.Start();
Foo();
stopwatch.Stop();
counter.RawValue = stopwatch.TotalMilliseonds;

目前我正在使用NumberOfItems64但是除非执行新操作,否则它会持续计数器的最后一个值。这是可取的吗?或者,一旦操作完成,计数器是否应该变为零?在这种情况下你会选择哪种柜台类型?为什么?

4 个答案:

答案 0 :(得分:7)

这听起来像 AverageTimer32 的好候选人。有关详细信息,请参阅this SO answer

答案 1 :(得分:1)

要添加到上一个答案,CodeProject上的预制和定制性能计数器都有very good article

答案 2 :(得分:0)

我通常使用秒表,但我也使用了p / invoke到kernel32.dll:

  [DllImport("Kernel32.dll")]
  private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);

  [DllImport("Kernel32.dll")]
  private static extern bool QueryPerformanceFrequency(out long lpFrequency);

我有两个名为Start()和Stop()的方法:

  public void Start()
  {
     Thread.Sleep(0);
     QueryPerformanceCounter(out startTime);
  }


  public void Stop()
  {
     QueryPerformanceCounter(out stopTime);
  }

要查询对Start()和Stop()的调用之间的持续时间:

  public double Duration
  {
     get
     {
        return (double)(stopTime - startTime)*1000 / (double)freq;
     }
  }

请注意freq在构造函数中确定:

  public PerformanceTimer()
  {
     startTime = 0;
     stopTime = 0;

     if (QueryPerformanceFrequency(out freq) == false)
     {
        // not supported
        throw new Win32Exception();
     }
  }

根据我的需要,我没有发现太多差异,虽然我建议你们两个都试着看看什么适合你。

编辑:我找到了original code from MSDN。似乎自.Net 1.1以来有一些改进。带回家的消息是Microsoft 声明该方法提供纳秒精度。

答案 3 :(得分:0)

答案和问题:

答案:低技术对我有用。你想要几微秒?循环10 ^ 6次并使用你的手表。

问题:您是否在问,因为您想让代码更快?然后是consider this