在我们的应用程序中,我们使用 Windows 性能计数器来存储一些应用程序指标,稍后在某些 Web 服务中检索这些指标。
我对从计数器读取值所需的时间有疑问。我已经查看了应用程序的其余部分,一切都很好,性能方面,但是从循环内的计数器(从列表或数组)读取需要花费大量时间。
示例代码:
// This triggers a read of the counter's initial value (1000ms delay following for calculated counters)
counters.ToList().ForEach(counter => counter.NextValue());
在我对上面的循环进行的测试中,1,359 个计数器的列表需要 20 秒,并且使用秒表,读取计数器值的平均时间似乎是 0-10 毫秒,或大约 80-90 毫秒。其中很多需要 0ms,最高约为 170ms,平均非零约为 80-90ms。
也许我太乐观了,但我认为读取 1,000 个数值应该只需要几毫秒。这里正在进行的处理是否比我意识到的要多?
实际上,我稍后在逻辑中还有另一个循环,它获取计算计数器的第二个值。这只会让事情变得更加糟糕。 :)
Thanks!
Update 1
我将计数器检索包裹在秒表中,结果令我感到惊讶。即使是简单的属性也可以读取.RawValue
仍然需要过多的时间。据我了解,计数器的工作原理基本相同,并且检索速度应该非常快;奇怪的是,我还发现了一种模式,即网络类别的计数器需要更长的时间。
根据http://joe.blog.freemansoft.com/2014/03/windows-performance-counters.html http://joe.blog.freemansoft.com/2014/03/windows-performance-counters.html,性能计数器服务的性能甚至不应该成为考虑因素。
我已将一些秒表结果发布到以下粘贴箱:http://pastebin.com/raw.php?i=aDJk2Tru http://pastebin.com/raw.php?i=aDJk2Tru
我的代码如下:
Stopwatch t;
foreach (var c in counters)
{
t = Stopwatch.StartNew();
var r = c.RawValue;
Debug.WriteLine(t.ElapsedMilliseconds.ToString("000") + " - " + c.CategoryName + ":" + c.CounterName + "(" + c.CounterType + ") = " + r);
}
正如你在粘贴中看到的,很多读取都是 0,但也有很多在 50-100ms 范围内。我真的不明白怎么会这样。当然,一个计数器值应该与其他计数器值一样快,对吧?