2014-02-21 4 views
2

Я вычисляю использование ЦП на нескольких моих серверах. Но расчет очень, очень медленный.Расчет использования ЦП: улучшение кода

Вот мой код до сих пор:

While it <= 5 
    Dim myOptions As New ConnectionOptions 
    myOptions.Username = _myParameters("user") 
    myOptions.Password = _myParameters("password") 

    Dim myRoot As String = "\\" & _myParameters("server") & "\root\cimv2" 
    Dim myScope As New ManagementScope(myRoot, myOptions) 

    Dim myQuery As New ObjectQuery(String.Format("select * from Win32_Processor")) 

    Dim mySearcher As New ManagementObjectSearcher(myScope, myQuery) 
    Dim myCollection As ManagementObjectCollection = mySearcher.Get 

    For Each OS As ManagementObject In myCollection 
     values.Add(OS("LoadPercentage")) 
    Next 

    Threading.Thread.Sleep(100) //Set some time between two calculations 
    itCounter += 1 
End While 

код висит каждый раз, когда на

For Each OS As ManagementObject In myCollection 

Приложение теряет около 2-3 секунд там. В случае одного CPU это не проблема. Но в нашем случае

  • Вычислить среднее значение, используя 5 считывает

    2,5 сек * 5 = 12,5 сек

  • Мониторинг около 15 процессора

    12,5 сек * 15 = 3мин

3 мин. Между двумя обновлениями слишком длинны.

Вопрос: Причина и решение этой задержки?

Примечание: Этот код уже работает в другом потоке.

Примечание2: Eventual C# код приветствуется, а также

Solution (Со многими, большое спасибо Джон Эгертон)

Для будущих зрителей это решение решить это для меня:

 Dim logon As New DlaLogon // control used for impersonation 
     logon.impersonateValidUser(//Impersonate here using username + password) 
     Dim cpuPerformance As New PerformanceCounter() 
     cpuPerformance.MachineName = myParameters("server") //myServername 
     cpuPerformance.CategoryName = "Processor" 
     cpuPerformance.CounterName = "% Processor Time" 
     cpuPerformance.InstanceName = "_Total" 

     // Calculate average over 5 times 
     While it <= 5 
      //Add the result to List 'CpuReads' 
      //We will calculate the average based on that list 
      cpuReads.Add(cpuPerformance.NextValue()) 
      Threading.Thread.Sleep(500) // sleep for 0.5 sec 
      it += 1 
     End While 
     it = 0 
     logon.undoImpersonation() // Undo impersonation 

Я надеюсь, что это может быть полезно

ответ

5

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

This answer Дает хороший пример.

+0

Сладкая мать бога! Какая разница в производительности! Thnx человек! – User999999

+2

. Framework .Net содержит огромное количество действительно полезных вещей. Проблема во многом заключается в том, что ваша проблема уже может быть решена с помощью фреймворка, а затем сможет его найти! –

Смежные вопросы