6

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

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

目前我正在使用 NumberOfItems64 ,但除非执行新操作,否则它会保留计数器的最后一个值。这是可取的吗?还是应该在操作完成后立即归零?在这种情况下,您会选择哪种计数器类型,为什么?

4

4 回答 4

7

这听起来像是AverageTimer32的不错选择。有关更多详细信息,请参阅此 SO 答案

于 2009-12-10T08:16:46.487 回答
1

要添加到先前的答案,CodeProject 上有一篇关于预制和定制性能计数器的非常好的文章。

于 2009-12-10T08:12:50.527 回答
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();
     }
  }

就我的需要而言,我没有注意到有太大的不同,尽管我建议你尝试两者来看看什么适合你。

编辑:我能够从 MSDN 找到原始代码。自 .Net 1.1 以来似乎有一些改进。带回家的消息是,微软声称这种方法可以提供纳秒级的精度。

于 2009-12-10T08:07:51.693 回答
0

一个答案和一个问题:

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

问:你问是因为你想让你的代码更快吗?然后考虑这个

于 2009-12-10T13:03:06.900 回答