我正在使用" PerformanceCounter" C#类计算低于2个计数器"可用字节"和#34;%使用的字节数"记忆"记忆"类别。
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()"用于"%承诺使用的字节数"计数器。
是否有统一的方法来计算两个或所有计数器?
答案 0 :(得分:1)
根据我的经验和主要是MSDN文档,它是根据性能计数器类别而不同,然后再根据您的案例中的特定属性属性(例如Available Bytes
或% Committed
)。
您正在寻找的是NextSample()。
财产:RawValue
获取或设置此计数器的原始值或未计算值。
^意味着它不一定取决于创建它的开发人员。
方法:NextValue()
获取计数器样本并返回其计算值。
^意味着它取决于创建它的开发人员。
方法:NextSample()
获取计数器样本,并返回其原始值或未计算值。
也是很久以前向我解释过的东西,所以把它当作一粒盐,RawValue的概念并不总是有效。
RawValues用于创建样本。 NextSample()或样本是RawValues随时间变化的平均值 - 更加真实。 NextValue()被清理的样本转换为%,或从字节转换为千字节(基于值的上下文和开发人员的实现)。
因此,在我看来,即使信息超过10年,也要放弃使用RawValue并在其位置使用NextSample() - 如果您需要一个真实/准确的值。
答案 1 :(得分:1)
它仅因类别而异,因为不同的类别包含不同的计数器类型。 PerformanceCounter.CounterType
属性定义计数器所持有的数据类型,以及数据的计算方式。对于计算原始值差异的计数器没有意义,因为对于想要进行测量的不同客户,差异可能在不同的时间段内。有关不同类型的详细信息,请参阅Performance Counter Type Enumeration。如果您真的想深入了解每种类型的工作原理,那么您必须使用所有这些基于的Win32文档。曾经有一个页面都有这个,但我现在很难找到它。我能找到的最近的是:https://technet.microsoft.com/en-us/library/cc960029.aspx。一些性能计数器类型使用主计数器和“基础”计数器,然后使用基于每个(以及可能的系统时间)的当前和先前原始值的公式来计算NextValue()
。 RawValue
可能出现对某些计数器类型无效,因为以与计算值相同的方式解释它是没有意义的。例如,IIRC用于进程的%CPU,原始值是自程序启动以来使用的CPU刻度数,如果解释为百分比则为无意义。与之前的值和经过的时间(从中也可以推断出最大可能的变化)相比,它才有意义。
使用RawValue
对某些计数器有意义,而不是其他计数器。但是,NextValue()
在您第一次调用它时通常无法返回有意义的值,因为当它计算为样本之间的差异时,您没有先前的样本来与之进行比较。您可以忽略它,或者您可以将代码设置为在启动期间调用一次,以便后续调用获得实际值。请记住,预计会在计时器上调用NextValue()
。例如,如果您在“已发送网络字节数”计数器上调用它,它将返回上一次调用与此调用之间发送的字节数。因此,例如,如果您在初始呼叫后2秒呼叫网络字节已发送计数器上的NextValue()
,然后在2分钟后再次呼叫,您将获得非常不同的值,即使网络传输是稳定的,因为呼叫2秒后返回2秒内传输的字节数,2分钟后调用将返回2分钟内传输的字节数。
因此,简而言之,您可以对所有计数器类型使用NextValue()
,但必须丢弃或忽略返回的第一个值,并且必须在固定的时间间隔内调用NextValue()
以使结果为有意义(就像交互式Windows性能监视器程序一样)。