在我们的应用程序中,我们使用Windows性能计数器来存储一些应用程序指标,稍后在某些Web服务中检索这些指标。
我遇到了从计数器读取值所需的时间过长的问题。我已经查看了我的应用程序的其余部分,性能方面都很好,但是在循环中(从List或array)读取计数器需要很长时间。
示例代码:
在我测试的循环中,1,359个计数器需要20秒,经过秒表测量,读取计数器值的平均时间为0-10ms或80-90ms左右。其中许多计数器需要0ms,最高的大约为170ms,非零平均值约为80-90ms。也许我太乐观了,但我本来以为读取1,000个数字值只需要几毫秒。这里是否有更多的处理比我所知道的要多?实际上,在我的逻辑后面还有另一个循环,获取计算计数器的第二个值。这使得情况变得更糟。:)谢谢!
正如您在粘贴中看到的那样,很多读数为0,但是有很多处于50-100毫秒的范围内。我真的不明白这是怎么回事。毕竟,一个计数器值应该与任何其他值一样快,对吧?
我遇到了从计数器读取值所需的时间过长的问题。我已经查看了我的应用程序的其余部分,性能方面都很好,但是在循环中(从List或array)读取计数器需要很长时间。
示例代码:
// 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-10ms或80-90ms左右。其中许多计数器需要0ms,最高的大约为170ms,非零平均值约为80-90ms。也许我太乐观了,但我本来以为读取1,000个数字值只需要几毫秒。这里是否有更多的处理比我所知道的要多?实际上,在我的逻辑后面还有另一个循环,获取计算计数器的第二个值。这使得情况变得更糟。:)谢谢!
更新1
我在计数器检索中添加了一个秒表,并对结果感到惊讶。即使是读取.RawValue
这样简单的属性,仍然需要很长时间。据我所知,所有计数器基本上都是相同的,检索应该非常快;奇怪的是,我还看到一种模式,即网络类别的计数器需要更长时间。
根据http://joe.blog.freemansoft.com/2014/03/windows-performance-counters.html,性能计数器服务的性能甚至不应该考虑。
我已经将一些秒表结果发布到以下pastebin: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-100毫秒的范围内。我真的不明白这是怎么回事。毕竟,一个计数器值应该与任何其他值一样快,对吧?