问题是,AverageTimer32
没有显示一些历史平均值。来自文档:
平均计数器,用于测量完成流程或操作平均所需的时间。这种类型的计数器显示采样间隔的总经过时间与该时间内完成的进程或操作的数量的比率。该计数器类型以系统时钟的滴答声为单位测量时间。
公式:((N1 - N0)/F)/(B1 - B0),其中 N1 和 N0 是性能计数器读数,B1 和 B0 是其对应的 AverageBase 值,F 是每秒的滴答数。
有趣的部分是公式。性能计数器仅显示两个性能计数器读数之间的平均值。因此,如果没有发出任何请求,则结果值为 0,因为分子为 0。
也许可以通过某种方式自行计算该值并通过其他类型的性能计数器公开它。
编辑:
我编写了一个演示应用程序来演示解决方法,但感觉很混乱。我创建了一个NumberOfItems32
性能计数器。
var counterDataCollection = new CounterCreationDataCollection();
var averageRandomNumer = new CounterCreationData
{
CounterType = PerformanceCounterType.NumberOfItems32,
CounterName = averageRandomNumberCounterName,
CounterHelp = "Views the average random number."
};
counterDataCollection.Add(averageRandomNumer);
PerformanceCounterCategory.Create(
categoryName,
"Displays the various performance counters of a test application",
PerformanceCounterCategoryType.MultiInstance,
counterDataCollection);
并像这样设置值:
var averageRandomNumberPerfCounter = new PerformanceCounter(categoryName, averageRandomNumberCounterName, "firstInstance", false);
var random = new Random();
var currentAverage = 0d;
var numberOfReadings = 0L;
while (true)
{
var nextRandom = random.Next(1, 101);
// ATTENTION: real code should handle overflow properly
numberOfReadings++;
currentAverage = (((numberOfReadings - 1) * currentAverage) + nextRandom) / numberOfReadings;
averageRandomNumberPerfCounter.RawValue = (long)currentAverage;
Thread.Sleep(1000);
}
这种解决方案的缺点是显而易见的。由于性能计数器只能存储long
你会失去平均值的小数位。此问题的另一个解决方法是缩放您的值,例如将它们乘以 10,然后在性能监视器中选择较低的缩放比例。