Здесь есть компромисс, но в основном вы хотите использовать файлы 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.