Является ли log4net намного медленнее, чем System.Diagnostics.Trace? - PullRequest
18 голосов
/ 14 октября 2008

Я изучаю различия между использованием log4net и System.Diagnostics.Trace для ведения журнала, и мне любопытно, какие различия в производительности я наблюдал.

Я создал тестовое приложение для сравнения производительности обоих методов ведения журнала в нескольких сценариях и обнаружил, что log4net значительно медленнее, чем класс Trace. Например, в сценарии, где я регистрирую 1000 сообщений без форматирования строки, среднее время выполнения log4net более 1000 попыток составляет 9,00 мс. Trace выполняется со средним значением 1,13 мс. Во многих моих тестовых примерах относительно большое количество различий во времени выполнения log4net; Периодический характер отдаленных длительных казней, по-видимому, предполагает вмешательство GC. Работа с CLR Profiler подтверждает, что существует большое количество коллекций для тонны log4net.Core.LoggingEvent сгенерированных объектов (если честно, похоже, что Trace генерирует также тонну Char[] объектов, но это не так. не отображать большую дисперсию, что log4net.)

Одна вещь, которую я здесь имею в виду, это то, что хотя log4net кажется примерно в 9 раз медленнее, чем Trace, разница составляет 8 мс на 1000 итераций; это не совсем значительный спад производительности. Тем не менее, некоторые из моих ожидаемых вариантов использования могут вызывать методы, которые регистрируют вещи сотни тысяч раз, и эти числа взяты с моей быстрой машины. На более медленной машине, более типичной для конфигураций наших пользователей, разница составляет от 170 мс до 11 мс, что немного тревожнее.

Является ли эта производительность типичной для log4net, или есть некоторые ошибки, которые могут значительно повысить производительность log4net?

( ПРИМЕЧАНИЕ. Мне известно, что форматирование строк может изменить время выполнения; я пытаюсь сравнить яблоки с яблоками. У меня есть тестовые наборы без форматирования и тестовые наборы с форматированием; log4net остается пропорционально медленным, независимо от того, является ли строка форматирование используется или нет. )

История до сих пор:

  • Роберт Гулд имеет лучший ответ на вопрос; Мне было в основном любопытно, было ли типичным видеть, что log4net работает намного медленнее, чем класс Trace.
  • Ответ Алекса Шнайдера - интересная информация, но на самом деле не подпадает под суть вопроса. Половина намерения ввести это ведение журнала состоит в том, чтобы помочь отладить как логические, так и проблемы с производительностью в живых системах; наши клиенты используют наши продукты во многих экзотических сценариях, которые зачастую сложно воспроизвести без дорогостоящих и масштабных аппаратных конфигураций. Моя главная проблема заключается в том, что большая разница во времени между «не ведением журнала» и «ведением журнала» может повлиять на систему таким образом, что ошибок не будет. В итоге масштаб снижения производительности велик, но величина мала, поэтому я надеюсь, что это не будет проблемой.

Ответы [ 5 ]

12 голосов
/ 14 октября 2008

да log4xxx медленнее, чем трассировка, так как обычно трассировка - это инструмент, близкий к ядру, а log4xxx - гораздо более мощный инструмент. Лично я предпочитаю log4xxx из-за его гибкости, но если вы хотите что-то, что не так сильно влияет, и вам не нужны журналы для производства, скажем, в отладке достаточно только трассировки.

Примечание: я использую log4xxx, потому что то же самое относится ко всем языкам с библиотекой log4, а не только к .Net

6 голосов
/ 04 мая 2009

Вас может заинтересовать библиотека Common.Logging . Это тонкая оболочка абстракции над существующими реализациями ведения журналов, которая позволяет подключать любую среду ведения журналов, которая вам нравится во время выполнения. Кроме того, он намного быстрее, чем System.Diagnostics.Trace, как описано в моем блоге о производительности .

НТН, Эрих

4 голосов
/ 15 октября 2008

По моему опыту, производительность log4net не является проблемой в большинстве случаев. На самом деле вопрос в том, зачем вам нужно «регистрировать вещи сотни тысяч раз» в производственной системе.
Насколько я понимаю, в производственной среде вы должны регистрировать только минимальный уровень (информация может быть уровнем предупреждения) и только при необходимости (отладка проблемы на сайте) должна активировать отладку на уровне отладки.

1 голос
/ 16 октября 2008

Если вы хотите получить лучшее из обоих миров, log4net также позволит вам войти в трассировщик aspnet. Я включаю эту опцию, когда хочу получить статистику производительности, связанную с конкретными событиями в моем журнале.

0 голосов
/ 14 мая 2013

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

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

...