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

时间:2017-04-26 12:47:16

标签: c# performancecounter

我正在使用" 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()"用于"%承诺使用的字节数"计数器。

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

2 个答案:

答案 0 :(得分:1)

根据我的经验和主要是MSDN文档,它是根据性能计数器类别而不同,然后再根据您的案例中的特定属性属性(例如Available Bytes% Committed)。

您正在寻找的是NextSample()。

Perf Counter

财产: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性能监视器程序一样)。