以与语言无关的方式检索性能计数器值

时间:2011-04-07 13:28:01

标签: c# c++ windows performancecounter

在Windows下,性能计数器具有不同的名称,具体取决于操作系统语言。例如,在英文版Windows上,有性能计数器\Processor(_Total)\% Processor Time。在德语版Windows上,同一个计数器称为\Prozessor(_Total)\Prozessorzeit (%)

有没有办法以与语言无关的方式检索性能计数器值(使用C ++或C#)?或者是否有替代方案可以在没有性能计数器的情况下获得整个计算机的处理器负载?

4 个答案:

答案 0 :(得分:8)

每个PerfMon计数器都有一个唯一的(每台机器)整数ID来标识PerfMon计数器(但是在标准计数器的情况下,这个id保证保持不变)。

将PerfMon计数器ID与其美国英语名称及其本地化名称相关联的信息存储在注册表中的以下密钥中:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib

一旦您使用注册表获取PerfMon计数器名称(您可以将其作为标准计数器的常量嵌入到您的应用程序中),您可以使用PdhLookupPerfNameByIndex函数查找给定计数器的本地化名称ID。

有关详细信息,请参阅Using PDH APIs correctly in a localized language (Microsoft KB)

您可能还会发现Finding perfmon counter id via winreg (StackOverflow)有点相关。

答案 1 :(得分:0)

有WinAPI函数,QueryHighPerformanceCounterQueryHighPerformanceFrequency

答案 2 :(得分:0)

您是否尝试过使用Pdh辅助函数和PdhAddEnglishCounter函数?

答案 3 :(得分:0)

添加此

using System.Runtime.InteropServices;
using Microsoft.Win32;

在你的类中导入DLL(我的类被命名为Program)

[DllImport("pdh.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern UInt32 PdhLookupPerfIndexByName(string szMachineName, string szNameBuffer, ref uint pdwIndex);

以您的操作系统语言发送您想要的计数器名称,并返回英文名称

public string GetEnglishName(string name)
        {
            string buffer2 = name;
            UInt32 iRet2 = new UInt32();
            iRet3 = PdhLookupPerfIndexByName(null, buffer2, ref iRet2);
            //Console.WriteLine(iRet2.ToString());

            RegistryKey pRegKey = Registry.LocalMachine;
            pRegKey = pRegKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009");
            string[] after;
            after = (string[])pRegKey.GetValue("Counter");
            string value = iRet2.ToString();
            int pos = Array.IndexOf(after, value);
            return after[pos + 1];
        }

以下是如何使用它

Program m = new Program();
            string result = m.GetEnglishName("Mémoire");
            Console.WriteLine(result);