Как уменьшить загрузку процессора при загрузке журналов событий? - PullRequest
1 голос
/ 05 октября 2011

У меня есть программа, которая загружает системные журналы событий в Hastable для использования.Проблема в том, что он использует 100% процессора.Что является лучшим решением для снижения использования с помощью вызовов API.

Hashtable currentLog = (Hashtable)_logs[l.Log];

foreach (EventLogEntry e in l.Entries)
{    
    if (_lastRun <= e.TimeWritten.ToUniversalTime() )
    {                                
        if (_verboseOutput)
        {
            Logger.TraceWrite(String.Format(
                                    "Source={0}, EventId={1}, Date/Time={2}, Message={3}", 
                                     e.Source, 
                                     e.EventID, 
                                     e.TimeWritten, 
                                     e.Message));
        }

        string key = GetEventKey(e);
        if (currentLog[key] == null)
        {
            currentLog[key] = e;
        }
    }
}

Ответы [ 4 ]

0 голосов
/ 05 октября 2011

Обычно при 100% использовании ЦП нет ничего плохого 1 .Все это означает, что процессор работает на максимуме на протяжении всей операции.Это хорошая вещь.Зачем тратить время на то, чтобы заставить процессор перестать работать?Скорее всего, ОС является преимущественной ОС (поскольку вы пометили c #, скорее всего это будет Windows), поэтому комментарий Полинома о стабильности неверен, ОС будет переключать задачи независимо от нагрузки.

Если выуменьшите использование ЦП до 50%, тогда обработка займет вдвое больше времени.

Вы хотите спросить: «Как я могу сократить время, которое занимает этот алгоритм» / «Существует ли более эффективный алгоритм», поскольку любойАлгоритм, который вы используете, будет работать на 100% до завершения.

Было бы полезно, если бы вы объяснили, что вы пытаетесь сделать здесь, возможно, есть лучший способ сделать это.

Глядя накод, я думаю, самая большая нагрузка связана с методом GetEventKey, показывающим нам, что код может помочь.

  1. 100% использование ЦП в потоке графического интерфейса, как правило, плохо, так как графический интерфейс может статьнепригоден для использования, поскольку поток GUI должен ждать, пока метод, потребляющий ЦП, не завершит работу, прежде чем обрабатывать взаимодействие с пользователем.
0 голосов
/ 05 октября 2011

Вы можете загрузить журналы в отдельном потоке с низким приоритетом ( Thread.Priority ):

Thread thread = new Thread(loadLogsMethod);
thread.Priority = ThreadPriority.BelowNormal;
thread.Start();

РЕДАКТИРОВАТЬ: Поделегируя выполнение в отдельный поток, вы уменьшаете среднюю загрузку ЦП, но общее время выполнения будет увеличено.

0 голосов
/ 05 октября 2011

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

Вопрос, который я задал несколько месяцев назад, рассказывает о методах, которые вы можете использовать для измерения производительности вашего приложения, а также о некоторых соображениях, которые вы можете сделать при этом:

Функция профилирования - Visual Studio 2010 Ultimate

0 голосов
/ 05 октября 2011

Высокая загрузка ЦП, вероятно, связана с тем, что итератору приходится обходить весь журнал событий, чтобы проверить, есть ли новые. Попробуйте отключить foreach и использовать вместо него for. Вы также можете попробовать использовать инструменты анализа производительности в Visual Studio, чтобы увидеть, какие строки являются горячими точками ЦП.

...