Хит производительности с использованием файлов JAR - PullRequest
2 голосов
/ 09 мая 2011

Получаете ли вы снижение производительности при упаковке ваших классов в файлы Jar, а не просто при запуске распакованных классов?Скажем, например, у вас большое приложение, если много файлов нужно извлечь из архива, это замедлит ваше приложение?

Ответы [ 6 ]

8 голосов
/ 09 мая 2011

Нет, не будет. Классы загружаются в память и используются оттуда.

Возможно, это может немного замедлить время запуска, но это незначительно. Кроме того, если вы активно загружаете и выгружаете классы во время выполнения, это может привести к разнице, но все же незначительной.

Суть в том, что вы не должны распаковывать банки из соображений производительности.

3 голосов
/ 09 мая 2011

Маловероятно, что загрузка классов из разорванных каталогов приведет к какому-либо выигрышу в производительности. Если бы это было так, то несколько приложений Java (особенно серверы приложений Java EE) увидели бы выигрыш в производительности при запуске с разорванными JAR-файлами.

Более научной причиной отсутствия выигрыша в производительности может быть тот факт, что JAR обычно сжимается и доступен из очень определенного набора секторов на диске, что маловероятно в случае взорванных JAR. Это также означало бы, что существует значительная вероятность снижения производительности при использовании классов из разорванного JAR.

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

2 голосов
/ 09 мая 2011

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

1 голос
/ 09 мая 2011

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

0 голосов
/ 08 августа 2017

Здесь есть компромисс, но в основном вы хотите использовать файлы JAR.

Если вы загружаете только один класс, вы можете загрузить его как файл быстрее, чем считывать его из JAR.файл.Но вы, вероятно, потратите больше времени на поиск класса, особенно если он содержит несколько каталогов и среди множества других классов.

Если вы загружаете много классов, их загрузка будет большой потерей:быть шаги, чтобы открыть, прочитать и закрыть каждый из файлов в отдельности, тогда как вы сделали бы это только один раз для чтения из файла JAR.(Предположительно, вы сохраняете JAR открытым между загрузками классов; повторное открытие JAR для каждой загрузки классов будет огромной проблемой, если вы выполняете несколько загрузок классов.)

Более подробно, для загрузки классов,Вот две стратегии:

(1) Классы, представленные на диске.(2) Классы, упакованные в файл JAR.

Для (1) потребуется некоторая стоимость перехода корневого каталога до целевого класса.Это может быть сделано постепенно и по требованию, или это может быть сделано изначально для всего дерева каталогов.Если нужно перечислить очень много каталогов, эта стоимость будет довольно большой.

Также для (1) существует стоимость открытия и чтения отдельных классов.Для одного класса это меньше, чем стоимость открытия JAR, но для многих классов стоимость в конечном итоге станет больше из-за дополнительных затрат на открытие отдельных файлов.

Для (2), есть дополнительная стоимость начального открытия JAR, который будет читать индекс записей JAR.Это будет пропорционально количеству записей в JAR.

Для (2), при чтении одного ресурса для загрузки класса, будут затраты на поиск, распаковку и проверку ресурса класса.Декомпрессия обычно является стиркой, поскольку сжатие сокращает время чтения, но добавляет этап декомпрессии.Проверка является дополнительной, но может быть отключена.

С учетом этого, для (1), если весь каталог прочитан, это будет стоить гораздо больше, чем в (2), для открытия JAR,В (1), если каким-то образом вы постепенно читаете каталог, это может быть первоначально быстрее, но стоимость чтения отдельных классов в конечном итоге будет больше, чем стоимость чтения JAR (2).«В конечном итоге», вероятно, не будет слишком много загрузок классов.

Для сравнения двух сценариев существуют следующие дополнительные проблемы, которые необходимо учитывать:

(1) Издержки при наличии файлов на дискенамного выше, чем наличие только одного файла JAR с точки зрения необработанного хранилища и накладных расходов файловой системы.

(2) Доступ к классам, поскольку отдельные файлы будут использовать несколько файловых дескрипторов;для доступа к классам из JAR будет использоваться только один.

(3) Транспортировка классов становится рутиной, так как вам нужно сделать копию каталога или упаковать, скопировать и распаковать.Копирование многих отдельных файлов намного дороже, чем копирование одного файла JAR.

(4) Использование JAR позволяет использовать функции подписи JAR, встроенные в загрузку классов APIS.

В пространствеВ отношении серверов приложений влияние выбора между (1) и (2) проявляется при рассмотрении того, как классы упаковываются в файлы WAR.То есть классы могут быть упакованы в WEB-INF / classes или в JAR-файлы в WEB-INF / lib.Если сервер приложений распаковывает файлы WAR для доступа с работающего сервера, наличие классов в WEB-INF / classes добавляет очень большие накладные расходы.Серверы приложений обычно предпочитают, чтобы классы содержались в файлах JAR.

0 голосов
/ 27 января 2015

Нет, не будет.На большом приложении эффект, вероятно, будет отрицательным.Типичные издержки ввода / вывода выше, чем выигрыш от несжатия.Кроме того, банки имеют индекс, который повышает скорость при повторном доступе.Стоимость обхода дерева каталогов в файловой системе обычно выше, чем доступ к индексированному jar.

Проблема производительности исчезает, как только операционные системы начинают кэшировать файлы в памяти.Начиная с Java 6, JRE сначала проверяет кэш в Windows.Если кеш тёплый, приложение, которое загружается минутами, загружается через 10-20 секунд.Эффект должен быть аналогичным для jars и * .class-файлов в каталогах.Только не забывайте не путать этот эффект с оптимизацией, которую вы делаете, и всегда измеряйте при холодном старте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...