8
votes

Comment obtenir l'utilisation du processeur pour plus de 2 cœurs?

J'essaie d'entrer dans mon programme Utilisation du processeur divisé par un cœurs. Maintenant j'utilise la performanceCounter et changer l'instanceName entre 0 et 1, j'ai les données de 2 cœurs.

PerformanceCounter pc0 = new PerformanceCounter("Processor", "% Processor Time", "0");
PerformanceCounter pc1 = new PerformanceCounter("Processor", "% Processor Time", "1");


2 commentaires

Avez-vous essayé Nouveau PerformanceCounter ("processeur", "% de processeur", "2"); ?


Voir aussi Donc: Comment puis-je obtenir la charge de la CPU par noyau


5 Réponses :


6
votes

Je n'ai pas utilisé PerformanceCounter avant, mais y a-t-il quelque chose qui ne va pas avec cela? XXX


4 commentaires

Le problème avec cela est que vous obtiendrez une erreur si les noyaux n'existent pas réellement. L'erreur se produira dès que vous essayez d'obtenir une valeur hors du compteur (E.g pc4.rawvalue ). Cependant, si vous savez qu'il y a au moins 4 noyaux, votre code ira bien.


Exactement, j'essaie de le faire sur la machine avec 2 cœurs et une erreur d'instancename 2 n'existe pas, alors je pensais que cela ne fonctionnera pas. Maintenant, j'utilise une exception traitant et fonctionne bien sur l'architecture. Merci


@Spychu ma réponse vous empêchera de prendre une exception pour ce qui est vraiment ne devrait pas une condition exceptionnelle ...


Trouvez le nombre de noyaux de Ce lien et boucle!



9
votes

Je soupçonne que ce que vous demandez vraiment est " Comment puis-je compter le nombre de cœurs ?". Ce code comptera le nombre de cœurs, puis créez des compteurs de performance en fonction de cela.

int coreCount = 0;
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
{
    coreCount += int.Parse(item["NumberOfCores"].ToString());
}

PerformanceCounter[] pc = new PerformanceCounter[coreCount];

for (int i = 0; i < coreCount; i++)
{
    pc[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
    Console.WriteLine(pc[i].CounterName);
}


5 commentaires

Qu'en est-il de la prise en charge de HTT et que nous voulons lire l'utilisation du processeur logique?


Voir la réponse acceptée sur l'autre question Stackoverflow ( Stackoverflow.com/Questtions/1542213/... ). Cela donne des détails sur toutes les choses que vous voudrez peut-être lire.


J'ai déjà lu cela auparavant. J'ai les données sur la quantité de processeur logique, etc., mais je dois lire le processorime de la CPU logique. Je ne suis pas sûr que je puisse faire cela en utilisant performancecounter


Hmmm. Je pense que la catégorie de processeur fait réellement référence aux processeurs logiques et que la difficulté consistera à générer une utilisation de processeur par cœur. Vous auriez besoin de faire quelque chose comme l'identité que la paire de processeur fonctionne sur un seul noyau, puis prenez la moyenne de leur utilisation. Je soupçonne que c'est plus compliqué que ça ...


NumérosoflogicalProcesseurs est le point de reproduction correct du noyau physique de noyau de retour, dans ma machine (i7) numérosofcore = 4 mais numérosoflogicalProcesseurs = 8; de toute façon tnx



3
votes

Une chose comme celle-ci devrait également fonctionner pour votre besoin xxx


0 commentaires

6
votes

Ceci pourrait être une vieille question, mais pour quelqu'un d'autre à la recherche d'une solution différente, pourquoi n'utilisez-vous pas System.Environment?

public static List<System.Diagnostics.PerformanceCounter> GetPerformanceCounters()
{
    List<System.Diagnostics.PerformanceCounter> performanceCounters = new List<System.Diagnostics.PerformanceCounter>();
    int procCount = System.Environment.ProcessorCount;
    for (int i = 0; i < procCount; i++)
    {
        System.Diagnostics.PerformanceCounter pc = new System.Diagnostics.PerformanceCounter("Processor", "% Processor Time", i.ToString());
        performanceCounters.Add(pc);
    }
    return performanceCounters;
}


1 commentaires

Toujours une bonne réponse même sans le compte de base.



0
votes
foreach (var item in new System.Management.ManagementObjectSearcher("Select NumberOfLogicalProcessors from Win32_Processor").Get())
    coreCount += int.Parse(item["NumberOfLogicalProcessors"].ToString());

PerformanceCounter[] pc = new PerformanceCounter[coreCount];

for (int i = 0; i < coreCount; i++)
    pc[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());

0 commentaires