Il suffit d'entrer dans la programmation C# alors s'il vous plaît nu avec moi :)C# Réduire l'utilisation du processeur - Bande passante du réseau Script
Je vous écris cette classe pour surveiller la bande passante en passant par toutes les interfaces réseau. Bien que tout cela fonctionne à merveille, je veux essayer de réduire l'utilisation du processeur lors de la requête. La raison en est que je lance cette opération toutes les deux secondes, ce qui ajoute environ 7 à 8% d'utilisation du processeur au processus à chaque fois. Y a-t-il un moyen de réduire la quantité de cycles CPU?
PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface");
String[] instancename = category.GetInstanceNames();
foreach (string name in instancename)
{
String networkCard = name;
const int numberOfIterations = 10;
PerformanceCounter bandwidthCounter = new PerformanceCounter("Network Interface", "Current Bandwidth", networkCard);
float bandwidth = bandwidthCounter.NextValue();
PerformanceCounter dataSentCounter = new PerformanceCounter("Network Interface", "Bytes Sent/sec", networkCard);
PerformanceCounter dataReceivedCounter = new PerformanceCounter("Network Interface", "Bytes Received/sec", networkCard);
float sendSum = 0;
float receiveSum = 0;
for (int index = 0; index < numberOfIterations; index++)
{
sendSum += dataSentCounter.NextValue();
receiveSum += dataReceivedCounter.NextValue();
}
float dataSent = sendSum;
float dataReceived = receiveSum;
double dout = (((8 * (dataSent))/(bandwidth * numberOfIterations) * 100) * 1024)/100;
double din = (((8 * (dataReceived))/(bandwidth * numberOfIterations) * 100) * 1024)/100;
dout = Math.Round(dout, 2);
din = Math.Round(din, 2);
string doutround = Convert.ToString(dout);
string dinround = Convert.ToString(din);
String output = dinround + "/" + doutround;
GlobalsWMI.NetIOs.Add(output);
}
String tooutput = String.Join("AND", GlobalsWMI.NetIOs);
GlobalsWMI.NetIOs.Clear();
return tooutput;
Merci,
Comment ça marche? Commencer un nouveau processus est relativement cher donc si vous pouvez le démarrer une fois et l'exécuter périodiquement cela réduirait * probablement * le pic. En outre, de quel genre de chiffres parlez-vous avec instanceNames et numberOfIterations? – LoztInSpace
J'ai couru le profileur et peux voir un certain nombre de choses: d'abord PerformanceCounter.NextValue() sur ma machine utilise jusqu'à 6-10% de CPU Je ne sais pas pourquoi mais juste fait. J'ai également remarqué que la création des noms d'instance est lente (category.GetInstanceNames()). Je me demande s'il y a une façon différente de le faire. – TheKingDave
Avez-vous regardé ma réponse (je suis désespéré pour rep). – TheKingDave