Я изучаю различия между использованием 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
.
- Ответ Алекса Шнайдера - интересная информация, но на самом деле не подпадает под суть вопроса. Половина намерения ввести это ведение журнала состоит в том, чтобы помочь отладить как логические, так и проблемы с производительностью в живых системах; наши клиенты используют наши продукты во многих экзотических сценариях, которые зачастую сложно воспроизвести без дорогостоящих и масштабных аппаратных конфигураций. Моя главная проблема заключается в том, что большая разница во времени между «не ведением журнала» и «ведением журнала» может повлиять на систему таким образом, что ошибок не будет. В итоге масштаб снижения производительности велик, но величина мала, поэтому я надеюсь, что это не будет проблемой.