C# 性能测试用秒表

C# 性能测试用秒表,c#,performance-testing,stopwatch,C#,Performance Testing,Stopwatch,对于一些私人项目,我使用秒表进行绩效衡量 但是,如果我想测量的呼叫重复次数较少,我的结果是0elapsedmillyses, 这使得计算平均值很困难 我想写我自己的秒表课。它可以用滴答声进行计算,并根据秒表、秒表和时间跨度、滴答毫秒给出一个模糊的ElapsedMicroseconds。这可能不是一个很好的方法 我确实需要winapi的高性能计数器支持的东西, 所以datetime之类的东西是不够的 还有其他想法吗?如果你得到0毫秒,这意味着间隔小于1毫秒。 您可以尝试用刻度测量周期,并使用频率:

对于一些私人项目,我使用
秒表
进行绩效衡量

但是,如果我想测量的呼叫重复次数较少,我的结果是0
elapsedmillyses
, 这使得计算平均值很困难

我想写我自己的秒表课。它可以用滴答声进行计算,并根据秒表、秒表和时间跨度、滴答毫秒给出一个模糊的
ElapsedMicroseconds
。这可能不是一个很好的方法

我确实需要winapi的高性能计数器支持的东西, 所以datetime之类的东西是不够的


还有其他想法吗?

如果你得到0毫秒,这意味着间隔小于1毫秒。 您可以尝试用刻度测量周期,并使用频率:

  Stopwatch watch = Stopwatch.StartNew();
  ...
  // Estimated code here 
  ...
  watch.Stop();

  // Microseconds
  int microSeconds = (int)(watch.ElapsedTicks * 1.0e6 / Stopwatch.Frequency + 0.4999);
  // Nanoseconds (estimation)
  int nanoSeconds = (int)(watch.ElapsedTicks * 1.0e9 / Stopwatch.Frequency + 0.4999);

秒表是你需要的东西。 使用:

double diffMs=(stopWatch.ElapsedTicks*1000.0)/stopWatch.Frequency

StopWathch.ElapsedMilliseconds定义为长。因此,它不可能比一毫秒更精确。


请原谅我的无知,(但是)如果它不到一毫秒(1000个滴答声),您当然不必诊断它的性能问题

确切地说,这就是计划。频率肯定比某些DateTime成员好,所以+1。感谢you@DmitryBychanko你能在你的计算中解释一下+0.4999吗?我已经把双精度舍入到最接近的整数微秒;e、 如果我有,比如说,3.87微秒,如果我输入(int)(3.87),它将返回3,这不是一个期望值。通常我们只加0.5,但我更喜欢0.5被四舍五入到0,而不是一,这就是为什么我把0.499999…我有很多要测量的函数调用。但是,在测试中必须至少做出10.000才能进行良好的测量是“无聊的”。@MareInfinitus这也是有效的。即使你能准确地测量一次通话,不同通话的差异也意味着如果你想对通话持续时间有一个有意义的近似值,你应该打大量的电话并计算平均时间。正如在另一篇评论中提到的,我正在打2000000个电话并计算平均值,但是当我看到317个滴答声和0个elapsedmillyseconds时,我想到了这个想法。为了得到一个好的测量值,你必须对这个函数进行大量的调用。你说你想要一个平均值。跑一堆,然后分开。这将给你一个更精确的速度估计。我打了2000000个电话,计算平均值。但我认为应该有一种更好的方法来衡量较小的数量。我的观点不是把每一个加在一起,而是把2000000的总时间除以。你尝试测量的尺寸越小,它就越不准确。
long microseconds = ticks / (TimeSpan.TicksPerMillisecond / 1000);