c # - Hent præstations tællerværdi på en sprogafhængig måde

Indlæg af Hanne Mølgaard Plasc

Problem



Under Windows har præstationstællere forskellige navne afhængigt af operativsystemets sprog. For eksempel findes der i en engelsk Windows-version performance tælleren Processor(\_Total)\% Processor Time. Den samme tæller hedder Prozessor(\_Total)Prozessorzeit (\%) på en tysk Windows-version.


Er der nogen måde at hente præstations tællerværdien på en sproguafhængig måde (ved hjælp af C ++ eller C #)? Eller er der et alternativ til at få processorens belastning på hele computeren uden ydeevne tællere?

Bedste reference


Hver PerfMon-tæller gives et unikt (pr. Maskine) heltal ID for at identificere PerfMon-tælleren (dog i tilfælde af standard tællere er dette id garanteret at forblive det samme).


Oplysningerne, der forbinder PerfMon, tæller id'er til både deres amerikanske engelsknavn og deres lokaliserede navn, der gemmes i registreringsdatabasen i følgende nøgle:


HKEY\_LOCAL\_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionPerflib


Når du har brugt registret til at få PerfMon-modnavnet (som du kan indlejre i din app som en konstant for standardtællere), kan du bruge funktionen PdhLookupPerfNameByIndex til at finde det lokaliserede navn for det givne tæller-id. [10]


Se Brug af PDH API'er korrekt på et lokaliseret sprog (Microsoft KB) for flere detaljer. [11]


Du kan også finde Find perfmon counter id via winreg (StackOverflow) noget relevant.

Andre referencer 1


Der er WinAPI-funktionerne, QueryHighPerformanceCounter og QueryHighPerformanceFrequency.

Andre referencer 2


Har du forsøgt at bruge Pdh-hjælperfunktionerne og funktionen PdhAddEnglishCounter? [13]

Andre referencer 3


Tilføj dette


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


I din klasse importerer DLL'en (min klassede hedder Program)


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


Send navnet på den tæller, du vil have i dit operativsystem, og returner det engelske NAME


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(@"SOFTWAREMicrosoftWindows NTCurrentVersionPerflib09");
            string[] after;
            after = (string[])pRegKey.GetValue("Counter");
            string value = iRet2.ToString();
            int pos = Array.IndexOf(after, value);
            return after[pos + 1];
        }


Sådan bruger du det


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