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

2024-04-13

我正在使用 C# 的“PerformanceCounter”类来计算“内存”类别下的以下 2 个计数器“可用字节”和“使用中的提交字节百分比”。

            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 https://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.countertype(v=vs.110).aspx属性定义计数器保存的数据类型,以及如何计算数据。对于测量随时间变化的差异的计数器来说,原始值存在差异是没有意义的,因为对于想要进行测量的不同客户来说,差异可能存在于不同的时间段内。请参阅性能计数器类型枚举 https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k(System.Diagnostics.PerformanceCounterType.AverageCount64);有关不同类型的更多信息。如果您确实想了解每种类型如何工作的详细信息,则必须求助于所有这些内容所基于的 Win32 文档。曾经有一个页面包含所有这些内容,但我现在很难找到它。我能找到的最接近的是这里:https://technet.microsoft.com/en-us/library/cc960029.aspx https://technet.microsoft.com/en-us/library/cc960029.aspx。某些性能计数器类型使用主计数器和“基本”计数器,然后使用基于每个计数器的当前和先前原始值(也可能还有系统时间)的公式来计算NextValue(). RawValue may appear对于某些计数器类型无效,因为以与计算值相同的方式解释它是没有意义的。例如,IIRC 表示进程使用的 CPU 百分比,原始值是自程序启动以来使用的 CPU 滴答数,如果将其解释为百分比,则毫无意义。仅当与之前的值和经过的时间(您还可以从中推断出最大可能的变化)进行比较时,它才有意义。

Using RawValue对于某些计数器有意义,但对于其他计数器则不然。然而,NextValue()第一次调用它时通常无法返回有意义的值,因为当它被计算为样本之间的差异时,您没有以前的样本可以与它进行比较。您可以忽略它,或者您可以将代码设置为在启动期间调用它一次,以便后续调用获得实际值。请记住NextValue()预计将在计时器上调用。例如,如果您在“网络发送字节数”计数器上调用它,它将返回上一次调用与本次调用之间发送的字节数。例如,如果你打电话NextValue()在初始调用后 2 秒和 2 分钟后再次在网络发送字节数计数器上,即使网络传输稳定,您也会得到非常不同的值,因为 2 秒后的调用返回的是传输的字节数2秒,2分钟后的调用将返回2分钟内传输的字节数。

所以,简而言之,你可以使用NextValue()对于所有计数器类型,但您必须丢弃或忽略返回的第一个值,并且必须调用NextValue()以固定的时间间隔使结果有意义(就像交互式 Windows 性能监视器程序所做的那样)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有统一的方法来计算 PerformanceCounter 任何类别内的任何计数器? 的相关文章

随机推荐