是否有任何统一的方法来计算PerformanceCounter的任何类别中的任何计数器?

问题描述:

我正在使用C#的“PerformanceCounter”类来计算“内存”类别下的2个计数器“可用字节”和“正在使用的字节数”。是否有任何统一的方法来计算PerformanceCounter的任何类别中的任何计数器?

  PerformanceCounter pc = new PerformanceCounter("Memory", "Available Bytes", true); 
     PerformanceCounter pc1 = new PerformanceCounter("Memory", "% Committed Bytes In Use", true); 

     var a = pc.RawValue; 
     var b = pc1.NextValue(); 

我看到这里的问题是,“RawValue”是用于“可用的字节数”计数器,而“NextValue()”是用于“虚拟内存比例在使用”计数器。

是否有统一的方法来计算两个或所有计数器?

由于不同的类别包含不同的计数器类型,因此每个类别只会有所不同。 PerformanceCounter.CounterType属性定义了计数器所持有的数据类型,以及数据如何计算。衡量一段时间内差异的原始价值差异的计数器是没有意义的,因为对于想要进行测量的不同客户而言,差异可能在不同的时间段。有关不同类型的更多信息,请参阅Performance Counter Type Enumeration。如果你真的想深入了解每种类型的工作细节,你就必须使用所有这些基于Win32的文档。以前有过这样一个页面,但目前我很难找到它。我能找到的最近的地方是:https://technet.microsoft.com/en-us/library/cc960029.aspx。一些性能计数器类型使用主计数器和“基本”计数器,然后使用基于当前和之前的每个原始值(以及可能的系统时间)的公式来计算NextValue()RawValue可能出现对某些计数器类型无效,因为它只是没有意义的解释它与计算值相同的方式。例如,用于进程的%CPU的IIRC,原始值是自程序启动以来使用的CPU滴答的数量,如果解释为百分比,则是无意义的。与以前的数值和经过的时间(从中可以推断出最大可能的变化)相比,它只是有意义的。

使用RawValue对某些计数器有意义,对其他计数器不适用。但是,NextValue()通常无法在第一次调用它时返回有意义的值,因为当它作为样本之间的差异进行计算时,您没有以前的样本来比较它。你可以忽略它,或者你可以设置你的代码在启动过程中调用它一次,以便后续的调用获得真正的值。请记住NextValue()预计会在计时器上被调用。例如,如果您在Network Bytes Sent计数器上调用它,它将返回前一个调用与此调用之间发送的字节数。例如,如果您在初始通话后2秒钟在网络字节发送计数器上呼叫NextValue(),然后在2分钟后再次呼叫NextValue(),则即使网络传输稳定,因为2秒后的呼叫为返回2秒内传输的字节数,2分钟后的通话将返回2分钟内传输的字节数。

因此,简而言之,你可以使用NextValue()所有计数器类型,但是你必须扔掉或者忽略第一个返回值,你必须调用NextValue()在一个固定的时间间隔对结果才有意义(就像交互式Windows性能监视器程序确实)。

根据我的经验和大多数MSDN文档,它是不同的性能计数器类别,然后再次通过特定属性属性,如Available Bytes% Committed您的情况。

什么可能是你在找的是NextSample()。

Perf Counter

物业:RawValue

获取或设置此计数器的原料,或者未计算,价值。

^这意味着它不一定取决于创建它的开发者。

方法:NextValue()

获取的计数器样品和用于返回的计算值。

^这意味着它取决于开发者创建它。

方法:NextSample()

获得计数器样本,并为它返回原始,未计算或,值。

此外,很久以前就向我解释过的东西,所以拿一粒盐来看,RawValue的概念并不总是有效。

RawValues用于创建样本。 NextSample()或样本是随着时间推移的RawValues的平均值 - 更现实得多。 NextValue()清理转换为%或从字节到千字节(基于值的上下文和开发人员的实现)的样本。

因此,即使信息已超过10年,我也会放弃使用RawValue,并在其位置使用NextSample() - 如果您需要一个现实/准确的值。