2013-06-05 2 views
0

просто попасть в C# программирование поэтому, пожалуйста, голые со мной :)C# Уменьшение CPU Usage - Network Bandwidth Script

Я пишу этот класс, чтобы контролировать пропускную способность, проходящей через все сетевые интерфейсы. Хотя все это прекрасно работает, я хочу попытаться уменьшить использование ЦП во время запроса. Причина в том, что я запускаю это каждые пару секунд, и это добавляет примерно 7-8% больше использования ЦП в процесс каждый раз. Есть ли способ уменьшить количество циклов процессора?

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; 

Спасибо,

+0

Как вы управляете этим? Запуск нового процесса относительно дорого, поэтому, если вы можете запустить его один раз и периодически запускать его, это может * уменьшить всплеск. Кроме того, какие цифры вы говорите с помощью instanceNames и numberOfIterations? – LoztInSpace

+0

Я пропустил профайлер и вижу пару вещей: сначала PerformanceCounter.NextValue() на моей машине использует процессор на 6-10%, я не знаю, почему, но он просто делает. Также я заметил, что создание имен экземпляров происходит медленно (category.GetInstanceNames()). Интересно, есть ли другой способ сделать это. – TheKingDave

+0

Вы посмотрели мой ответ (я отчаянно нуждаюсь в репутации). – TheKingDave

ответ

0

Ok Я пробовал различные вещи, и я думаю, что эта версия гораздо быстрее:

private string GetNetworkUsage(System.Net.NetworkInformation.NetworkInterface[] nis) 
{ 

foreach (NetworkInterface ni in nis) 
      { 
       float bandwidth = ni.Speed; 
       const int numberOfIterations = 10; 

       float sendSum = 0; 
       float receiveSum = 0; 

       float lastRec = ni.GetIPv4Statistics().BytesReceived; 
       float lastSent = ni.GetIPv4Statistics().BytesSent; 

       for (int index = 0; index < numberOfIterations; index++) 
       { 
        System.Threading.Thread.Sleep(10); 
        float br = ni.GetIPv4Statistics().BytesReceived; 
        float bs = ni.GetIPv4Statistics().BytesSent; 
        receiveSum += br - lastRec; 
        sendSum += bs - lastSent; 

        lastRec = br; 
        lastSent = bs; 

       } 

       float dataSent = sendSum; 
       float dataReceived = receiveSum; 

       double dout = (((8 * (dataSent))/(bandwidth) * 100) * 1024)/100; 
       double din = (((8 * (dataReceived))/(bandwidth) * 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; 
} 

вызов это так:

System.Net.NetworkInformation.NetworkInterface[] nis = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces(); 

    // this is you for loop add you sleep or however you do it here 
    for (int i = 0; i < int.MaxValue; i++) 
    { 
     Console.WriteLine(test(nis)); 
    } 

Пробовал это на моей системе, и он использует меньше ресурсов центрального процессора и быстрее, но я бы дважды проверить, что цифры, как вы ожидаете.

0

Вы могли бы уменьшить загрузку процессора в течение времени с System.Threading.Thread.Sleep (х) в некоторых точках - Ваша проверка будет длиться дольше, но с меньшим средним использованием CPU.

+0

Нет, это не так. Он будет использовать тот же процессор, но в другой период. – LoztInSpace

+0

Правильно, поэтому СРЕДНЕЕ использование ЦП уменьшено ;-) –

+0

Согласен, но это был не вопрос. – LoztInSpace