2012-03-14 58 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()時。