2016-07-28 110 views
2

我試圖通過使用Countertype爲PerformanceCounterType.RateOfCountsPerSecond32的性能計數器來監視每秒發生多少次操作。這看起來很簡單,但問題是輸出非常嘈雜。RateOfCountsPerSecond32產生鋸齒狀而非平滑曲線

enter image description here

該圖線不跟蹤平均率,但似乎跟蹤每秒的實際計數。該線從最小速率跳轉到最大值,而不是跟隨當前的平均速率曲線,這更平滑。

結果是圖形鋸齒鋸齒鋸齒形,造成大量無用的視覺噪聲干擾跟蹤許多計數器。上面例子中的鋸齒並不算太壞,但如果你的計數再次從0到1000變爲0,那麼你的整個圖形看起來就像是一個蹣跚學步的孩子。

enter image description here
(藝術家印象)

在第一示例中,我使用的隨機數生成器來Increment一至四次的計數器倍的第二

var rand = new Random(); 
var counters = new MuhCounterExample(); 
ThreadPool.QueueUserWorkItem(x => 
{ 
    while (true) 
    { 
     Thread.Sleep(rand.Next(250, 750)); 
     counters.Increment(); 
    } 
}); 
Console.WriteLine("Running"); 
Console.ReadLine(); 

在這種代碼MuhCounterExample是創建和銷燬該示例的計數器的類,Increment()只是簡單地調用PerformanceCounter.Increment()

我想是一種方法來平滑這個速度曲線進行使用平均值而不是當前值。我已經看過並嘗試過其他計數器類型,但它們似乎沒有一個適合我。我認爲唯一的方法是通過跟蹤執行時間來手動生成每秒的速率,並使用一個簡單的計數器(如NumberOfItems32)來僞造它,直到完成爲止。

這是我唯一的選擇嗎?我是否錯過了另一個計數器或計數器設置,它使我找到了我想要的東西?一個不錯的,平滑的,每秒鐘的速度曲線,咖啡因少,但仍然具有Folgers的大膽風格©?

+2

做一個平均的問題是,平均在什麼?最後兩個輸入?過去十年?最後一百?當您在perfview中查看它時,它會給出屏幕上所有可見點的平均值。 –

+0

@ScottChamberlain嗯,這是一個很好的觀點。在X上運行平均速度是我正在尋找的,是的。 – Will

+0

對於未來的訪問者,我最終使用基於鏈接目標的滾動平均值。平均歷史的平均時間取決於櫃檯的性質。如果我對短期內發生根本性變化感興趣,那麼我的歷史長度不會超過100年。如果我只關心平均數而不是趨勢數,那麼1000年的更長曆史可以消除任何不安情緒。壞事是你不能通過性能計數器接口來配置它,所以你必須添加更多的計數器或通過應用程序進行配置。 – Will

回答

1

跟蹤平均值。如果可能,定期繪製它以獲得更一致的外觀圖。