性能计数器的性能如何?

时间:2008-11-14 16:23:12

标签: performance performancecounter

当考虑使用性能计数器作为我公司的基于.NET的站点时,我想知道使用它们的开销有多大。

我是否希望让我的网站不断更新它的计数器,或者我最好只在我测量时做什么?

6 个答案:

答案 0 :(得分:30)

设置性能计数器的开销通常不足以担心(设置共享内存区域和某些.NET对象,以及CLR开销,因为CLR实际上为您管理)。这里我指的是像PerformanceCounter这样的类。

注册性能计数器的开销可能会相当慢,但通常不会引起关注,因为它打算在设置时发生一次,因为您想要更改机器范围的状态。你做的任何复制都会相形见绌。它通常不是你想在运行时做的事情。这里我指的是PerformanceCounterInstaller。

更新性能计数器的开销通常归结为在共享内存上执行互锁操作的成本。这比正常的内存访问慢,但它是一个处理器原语(这就是它如何在包括缓存在内的整个内存子系统中获得原子操作)。一般来说,这个成本并不高。它可能是正常内存操作的10倍,可能更糟糕,具体取决于更新以及跨线程和CPU的争用情况。但考虑到这一点,除了与原子更新进行跨进程通信的互锁操作以及没有锁定之外,实际上不可能做得更好。这里我指的是PerformanceCounter.Increment和类似的方法。

读取性能计数器的开销通常是从共享内存中读取。正如其他人所说,你想在一个合理的时间内进行采样(就像任何其他采样一样),但只要想到PerfMon并尝试将采样保持在人体尺度上(想想秒而不是毫秒),你可能没有问题。

最后,体验的吸引力:性能计数器非常轻巧,可以在Windows中的任何地方使用,从内核到驱动程序再到用户应用程序。微软在内部依赖它们。

建议:性能计数器的真正问题是理解中的学习曲线(温和)和衡量正确事物的曲线(看起来很容易,但通常你会弄错)。

答案 1 :(得分:20)

更新时性能影响可以忽略不计。微软的意图是你总是写入性能计数器。它是监视(或捕获)那些会导致性能下降的性能计数器。所以,只有当你使用像perfmon这样的东西来捕获数据时。

实际上,性能计数器对象只会“在测量时执行此操作”。

答案 2 :(得分:9)

我已经测试了很多。

在一台旧的compaq 1Ghz 1处理器机器上,我能够创建大约10,000个计数器并远程监控它们的CPU使用率约为20%。这些不是自定义计数器,只是检查CPU或其他。

基本上,您可以在任何体面的新机器上监控所有计数器,而且影响非常小。

对象的实例化可能需要很长时间,几秒到几分钟。我建议你为你收集的所有计数器多线程,否则你的应用程序将永远坐在那里创建这些对象。一旦你创建它需要这么长时间,不确定MS会做什么,但是你可以在1000个计数器中使用1000个线程同时为1个计数器和1个线程执行它。

答案 3 :(得分:7)

性能计数器只是指向共享内存(即内存映射文件)中4/8字节的指针,因此它们的成本与访问int / long变量非常相似。

答案 4 :(得分:2)

我同意famoushamsandwich,但是只要您的采样率合理(5秒或更长)并且您监控一组合理的计数器,那么测量的影响也可以忽略不计(在大多数情况下)。

答案 5 :(得分:1)

我发现的事情是,对于大多数应用程序而言,它并不那么慢。我不会把它放在一个紧密的循环中,或者每秒被称为数千次的东西。

其次,我发现以编程方式创建性能计数器非常慢,因此请确保先手动创建它们而不是代码。