.net - AverageTimer32 计数器值变为零

标签 .net system.diagnostics

我写了一段如下代码:

为了测试,我调用方法ComputeAndLog,在性能监视器中我可以看到非零平均值。然而,一旦我结束测试,平均性能计数器值就会降至零。知道为什么会这样吗?

可能我使用了错误的计数器?

我的要求是我有一个函数,并且我必须计算该函数平均需要多少时间才能完成。如下所示:

void ComputeAndLog()
{
    Stopwatch stopWatch = Stopwatch.StartNew();
    FunctionWhoseAveragetTimeIsToBeMeasured();
    write_counter(stopWatch.ElapsedTicks);
}

void write_counter(long timeForCompletion)
{
    averageTimeCounter.IncrementBy(timeForCompletion);
    averageBaseCounter.Increment();
}

谢谢 xoxo

最佳答案

AverageTimer32/64 不会计算您执行的所有测量的平均值。相反,它提供了测量值与测量操作数的比率。

基本上,您的代码的问题在于您每次执行测量时都使用新的计时器。

要了解 AverageTimer 的工作原理,了解其背后的公式可能会有所帮助。这也解释了为什么需要 AverageBase 才能使用 AverageTimer。

AverageTimer 的公式如下:

((N1 - N0) / F) / (B1 - B0)

  • N1 在时间 t 的当前读数(AverageTimer)
  • N0 之前的读数,在 t - 1(AverageTimer)
  • B1 当前计数器 t (AverageBase)
  • B0 计数器之前,t - 1(平均基数)
  • 计算刻度/秒的 F 因子

简而言之,公式采用当前时间(以刻度为单位)并减去前一个时间。结果除以因子 F 即可得出自上次在 t-1 进行测量以来操作运行的时间。

现在将其除以当前计数器减去之前的计数器。这通常可能是其中之一。这样您就可以得到一次测量的平均操作时间。

使用 AverageBase,您现在可以跨过各种测量点。考虑这样一种情况,您只能在每执行十次操作时设置一次计数器。自上次测量以来,您将为所有 10 个操作将 AverageTimer 增加新的时间测量值,但将 AverageBase 增加 10。最终,您将收到一项操作的平均时间(即使您已经测量了所有十个操作调用)。

查看您的代码示例,您始终发送从计时器开始到计时器结束的差异。让它成为一系列数字,例如 10, 9, 8, 7 ,6,同时将 AverageBase 增加 1。

对于第二次测量,您将收到以下结果:

(9 - 10)/F/(1 - 0) = -1/F/1

为了简单起见,F 为 1,结果将是 -1。

但是要提交的正确值应该是

10、19、27、34、40

我们将再次得到相同的示例

(19 - 10)/F/(1 - 0) = 9/F/1

同样,当 F 为 1 时,您的平均操作时间将为 9。 正如您所看到的,下一个测量的值需要大于前一个值,这样 AverageTimer 才能正常工作。

在您的示例中,您可能会使用全局秒表。使用 Start() (而不是 Restart())而不是重新启动它。如上所示,计数器将在内部计算时间差。这样您就能得到正确的测量结果。

归零也是有意义的,一旦完成测试或程序结束,计数器可能会关闭并且不再提供任何值。您可以通过调用计数器上的 Close() 方法来手动完成此操作。

关于.net - AverageTimer32 计数器值变为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9710463/

相关文章:

.net - 为什么 F# 中存在大写命名模式?

c# - 在 http 请求中加密登录凭据的正确方法是什么?

c# - MethodImplAttribute(InternalCall, Runtime) 对 COM Interop 接口(interface)的方法有何作用?

.net - SQLite 空值 - 在 .NET 计算中视为零

c# - 无法使用实例引用访问

c# - 配置自定义 TextWriterTraceListener 到 web.config

c# - 从 ECC X509Certificate 创建 X509Certificate2 在 C# 中抛出 'System.NotSupportedException'

c# - C#中如何获取每个处理器的CPU使用率?

c# - 系统.诊断.进程(); StartInfo.Arguments 使用环境变量作为参数

c# - asp.net 的动画图表控件