是否有任何统一的方法来计算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()。
物业:RawValue
获取或设置此计数器的原料,或者未计算,价值。
^这意味着它不一定取决于创建它的开发者。
方法:NextValue()
获取的计数器样品和用于返回的计算值。
^这意味着它取决于开发者创建它。
方法:NextSample()
获得计数器样本,并为它返回原始,未计算或,值。
此外,很久以前就向我解释过的东西,所以拿一粒盐来看,RawValue的概念并不总是有效。
RawValues用于创建样本。 NextSample()或样本是随着时间推移的RawValues的平均值 - 更现实得多。 NextValue()清理转换为%或从字节到千字节(基于值的上下文和开发人员的实现)的样本。
因此,即使信息已超过10年,我也会放弃使用RawValue,并在其位置使用NextSample() - 如果您需要一个现实/准确的值。