【问题标题】:Stopwatch for performance testing用于性能测试的秒表
【发布时间】:2013-07-18 15:41:02
【问题描述】:

对于一些私人项目,我使用Stopwatch 进行性能评估。

但是在我想要测量的低重复调用次数中,我最终得到 0 ElapsedMilliseconds, 这使得计算平均值变得困难。

我考虑编写自己的秒表类。它可以用刻度计算并根据Stopwatch.ElapsedTicksTimeSpan.TicksPerMillisecond 给出一个模糊的ElapsedMicroseconds。这可能不是一个很好的方法。

我绝对需要由 winapi 的高性能计数器支持的东西, 所以 datetime 等是不够的。

还有其他想法吗?

【问题讨论】:

  • 必须对该函数进行大量调用才能获得良好的测量结果。你说你想要一个everage。跑一堆然后分开。这将为您提供更准确的速度估计。
  • 我打了 2,000,000 次电话并计算平均值。但我认为应该有更好的方法来测量较小的数量。
  • 我的意思不是将每个相加,而是将 2,000,000 的总时间除以。您尝试进行的测量越小,它就越不准确。

标签: c# performance-testing stopwatch


【解决方案1】:

如果 ElapsedMicroseconds 为 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);

【讨论】:

  • 没错,这就是计划。频率肯定比某些 DateTime 成员好,所以 +1。谢谢
  • @DmitryBychanko 你能解释一下你计算中的+0.4999吗?
  • 我已经将 Double 舍入到最接近的 Int 微秒;例如如果我有 3.87 微秒,如果我输入 (int) (3.87) 它将返回 3,这不是所需的值。通常我们只添加 0.5,但我更喜欢将 0.5 舍入到零而不是一,这就是为什么我放 0.499999...
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    C# time in microseconds

    long microseconds = ticks / (TimeSpan.TicksPerMillisecond / 1000);
    

    【讨论】:

      【解决方案4】:

      原谅我的无知,(但是)如果它小于一毫秒(1000 滴答声),您肯定不必诊断它的性能问题

      【讨论】:

      • 我对要测量的函数有很多调用。但是必须至少达到 10.000 才能在测试中获得良好的测量结果是“无聊的”。
      • @MareInfinitus 也有效。即使您可以准确地测量一个呼叫,但不同呼叫的差异意味着您应该进行大量呼叫并平均时间,如果您想获得有意义的近似持续时间。
      • 正如另一条评论中提到的,我正在拨打 2,000,000 次电话并计算平均值,但是当我看到 317 个滴答声和 0 个 ElapsedMilliseconds 时,我想到了这个主意
      猜你喜欢
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多