我試圖通過使用Countertype爲PerformanceCounterType.RateOfCountsPerSecond32
的性能計數器來監視每秒發生多少次操作。這看起來很簡單,但問題是輸出非常嘈雜。RateOfCountsPerSecond32產生鋸齒狀而非平滑曲線
該圖線不跟蹤平均率,但似乎跟蹤每秒的實際計數。該線從最小速率跳轉到最大值,而不是跟隨當前的平均速率曲線,這更平滑。
結果是圖形鋸齒鋸齒鋸齒形,造成大量無用的視覺噪聲干擾跟蹤許多計數器。上面例子中的鋸齒並不算太壞,但如果你的計數再次從0到1000變爲0,那麼你的整個圖形看起來就像是一個蹣跚學步的孩子。
在第一示例中,我使用的隨機數生成器來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的大膽風格©?
做一個平均的問題是,平均在什麼?最後兩個輸入?過去十年?最後一百?當您在perfview中查看它時,它會給出屏幕上所有可見點的平均值。 –
@ScottChamberlain嗯,這是一個很好的觀點。在X上運行平均速度是我正在尋找的,是的。 – Will
對於未來的訪問者,我最終使用基於鏈接目標的滾動平均值。平均歷史的平均時間取決於櫃檯的性質。如果我對短期內發生根本性變化感興趣,那麼我的歷史長度不會超過100年。如果我只關心平均數而不是趨勢數,那麼1000年的更長曆史可以消除任何不安情緒。壞事是你不能通過性能計數器接口來配置它,所以你必須添加更多的計數器或通過應用程序進行配置。 – Will