2012-03-14 60 views
5

我已经写了一段代码这样下面:AverageTimer32计数器值变为零

为了测试我调用方法ComputeAndLog和性能监视器我可以看到非零平均值。但是,只要我结束测试,平均性能计数器值就会降至零。任何想法为什么这种情况?

也许我正在使用错误的计数器?

我的要求是,我有一个功能,我必须计算,平均多少时间,该功能需要完成。类似下面:

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

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

感谢 XOXO

+1

苏格拉底:没有增量的平均值是多少? – 2012-03-14 21:37:26

+0

对不起,我没有得到这个问题。可能我使用了错误的柜台?我已经用我的要求更新了初始代码。 – 2012-03-14 21:49:55

+0

这是自上次测量以来的平均持续时间。如果你没有记录任何东西,它会变成零,因为平均持续时间未定义(简化为零)。 – Guvante 2016-02-23 22:21:55

回答

4

的AverageTimer32/64不计算在执行的所有测量值的平均值。相反,它提供了您测量的比例与您测量的操作次数之间的关系。

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

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

用于AverageTimer的公式如下:

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

在时间t(AverageTimer)
  • N0读取之前,在t
    • N1电流读数 - 1(AverageTimer)
    • B1当前计数器在t(AverageBase)
    • B0计数器之前,在t - 1(Average Base )
    • F因子来计算蜱/秒

    简而言之的表现公式发生在蜱当前时间和减去前一个。除以系数F得出的结果为您自t-1上次测量以来的运行时间。

    现在除以前的当前计数器减去计数器。这可能通常是一个。因此,您有一次测量的平均操作时间。

    使用AverageBase,您现在可以跨越各种测量点。考虑一下你可以每十次执行一次设置计数器的情况。自上次测量以来,您将通过新的时间测量为所有十个操作递增AverageTimer,但将AverageBase增加十。最终,您将获得一次操作的平均时间(即使您已经测量了十次操作调用)。

    看看你的代码示例,你总是发送从定时器开始到定时器结束的差异。让这是一系列数字,如10,9,8,7,6,同时将AverageBase增加1。

    对于你知道将获得以下结果第二测量:

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

    其中F是1为了简单起见结果你会得到-1。

    然而提交的正确值应该是

    10,19,27,34,40

    再次相同的例子,我们将得到

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

    同样,F为1时,您的平均操作时间为9。 如您所见,下一个测量值需要大于前一个值,以便AverageTimer正常工作。

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

    去零也是有道理的,一旦你完成了你的测试或程序结束,计数器可能会被关闭,不再提供任何值。您可以通过调用计数器上的Close()方法手动执行此操作。

  • +0

    我不认为这个答案是正确的。在这个问题中,N总是*递增*由经过的滴答。所以N1不可能小于N0(就像第一个例子)。因此剩下的结论(可能)也是不正确的。 – 2015-07-29 14:27:00

    0

    我有类似的问题。 AverangeCounter在PerformanceMonitor中有很好的输出。但是在程序中,NextValue操作总是返回0.顺便说一下,在ElapsedTime计数器中,我需要相同的操作返回值。

    然后我理解了AverageTimer32的核心(我希望)。 您不应该希望AverageTimer32会显示某些工作的平均时间。这只是一个计时器,平均时间为一个操作并显示它。如果没有工作正在进行,则不会有任何操作时间存在,并且您将有0作为计数器的值。

    如果我每次添加NextValue来反击计数器,它会返回秒数(因为我知道它是返回的最后一个值,而不是平均值,AverageTimer32计数器有任何人都可能误解的名称)。如果我缓存它,那么我可以将它转换为更具可读性的形式,并将它用作程序中计数器的值(如果在第二次接收0时再次询问NextValue)。

    此外我想纠正以前的答案。你应该使用

    10,9%,8,7%,6

    代替

    10,19,27,34,40

    当您使用

    方法IncreaseBy和

    10, 19,27,34,40

    当您在RawValue中手动设置Stopwatch.GetTimestamp()时。