Использует ли log4j NIO для записи данных в файл? - PullRequest
4 голосов
/ 01 июля 2010

Кажется, это уже довольно быстро, и мне просто интересно, знает ли кто-нибудь, использует ли он NIO. Я попытался найти весь исходный код для NIO (ну, это своего рода способ поиска :) lol); но ничего не ударил. Кроме того, если он не использует NIO; Как вы думаете, стоит ли модифицировать log4j для использования NIO, чтобы сделать его еще быстрее? Любые советы и ссылки на некоторые ресурсы будут очень полезны.

Ответы [ 4 ]

3 голосов
/ 01 июля 2010

Также, если не используется NIO;Как вы думаете, стоит ли модифицировать log4j для использования NIO, чтобы сделать его более быстрым?

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

Похоже, у вас сложилось впечатление, что NIO «быстрее», но в целом это не так.Просто попробуйте создать два файла, один со стандартным вводом-выводом и один с NIO, записав в них кучу данных и закрыв их.Вы увидите, что производительность вряд ли отличается.NIO будет работать лучше только в определенных случаях использования;чаще всего это много соединений.

3 голосов
/ 01 июля 2010

Проверьте источник FileAppender .В значительной степени просто стандарт java.io.

1 голос
/ 18 декабря 2013

Прорабатывая ответ Confusion, File NIO также блокируется.Вот почему это не быстрее, чем традиционный файловый ввод-вывод в некоторых сценариях.Цитирование Книга О'Рейли по Java NIO :

Файловые каналы всегда блокируются и не могут быть переведены в неблокирующий режим.Современные операционные системы имеют сложные алгоритмы кэширования и предварительной выборки, которые обычно обеспечивают локальный дисковый ввод-вывод с очень низкой задержкой.Сетевые файловые системы обычно имеют более высокую задержку, но часто получают выгоду от той же оптимизации.Неблокирующая парадигма потокового ввода-вывода не имеет особого смысла для файлово-ориентированных операций из-за принципиально иного характера файлового ввода-вывода.Для файлового ввода / вывода истинный победитель - асинхронный ввод / вывод, который позволяет процессу запрашивать одну или несколько операций ввода / вывода из операционной системы, но не ожидает их завершения.В дальнейшем процесс уведомляется о том, что запрошенный ввод-вывод завершен.Асинхронный ввод-вывод - это расширенная возможность, недоступная во многих операционных системах.Он рассматривается как будущее усовершенствование NIO.

Редактировать: С учетом сказанного вы можете повысить эффективность чтения / записи, если используете File NIO с MappedByteBuffer.Обратите внимание, что использование MappedByteBuffer в Log4j 2 под рассмотрение .

1 голос
/ 02 июля 2010

Я не вижу причин, по которым FileChannel может быть в этом случае быстрее, чем FileOutputStream.

Может быть, с помощью MappedByteBuffer?но в режиме добавления поведение зависит от ОС.

в конечном счете, производительность зависит от вашего жесткого диска, ваш код очень мало значит.

...