Есть ли способ повысить скорость запуска JVM? - PullRequest
14 голосов
/ 30 октября 2010

Говорят, что с точки зрения производительности Java в 10 раз быстрее, чем python.Это то, что я вижу из тестов тоже.Но то, что действительно сбивает с толку Java, - это время запуска JVM.

Это тест, который я сделал:

$time xlsx2csv.py Types\ of\ ESI\ v2.doc-emb-Package-9
...
<output skipped>
real    0m0.085s
user    0m0.072s
sys     0m0.013s


$time java  -jar -client /usr/local/bin/tika-app-0.7.jar -m Types\ of\ ESI\ v2.doc-emb-Package-9

real    0m2.055s
user    0m2.433s
sys     0m0.078s

Тот же файл, XLSX-файл размером 12 КБ мс, встроенный в Docx и Python, равен 25xБыстрее !!WTH !!

Это занимает 2,055 с для Java.

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

Но для разбора файлов 10k + это просто не практично ..

В любом случае, чтобы ускорить его (я уже пробовал -clientвариант, и это только ускорить (так мало (20%)).

Моя другая идея?Запустить его как долго работающий демон, общаться через локальные сокеты UDP или Linux-ICP?

Ответы [ 6 ]

11 голосов
/ 30 октября 2010

Попробуйте Пистолет для ногтей .

Примечание: я не пользуюсь им лично.

6 голосов
/ 03 ноября 2012

Только что узнал о капельнице сегодня, как альтернативе замене гвоздя: https://github.com/flatland/drip Также смотрите эту страницу для некоторых общих советов: см. Также https://github.com/jruby/jruby/wiki/Improving-startup-time

2 голосов
/ 18 июля 2018

Я отсылаю вас к сообщению Мэтью Джиллиарда (mjg) в блоге на эту тему.Любые примеры кода ниже идут прямо оттуда.Я не буду приводить примеры хронометража, частично, чтобы сделать это коротким, а частично, чтобы побудить вас посетить его страницу.Мэтью работает над Fn Project , поэтому ему очень интересно выяснить, как сохранить время запуска на низком уровне.

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

Класс обмена данными ( CDS )

CDS кэширует детерминированный (аппаратно-зависимый) процесс запуска JDK.Это самый простой и самый старый (с версии 1,5) трюк в книге (и не очень известный).

Из Oracle

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

Вы можете создать дамп вручную, выполнив

⇒ java -Xshare:dump
Allocated shared space: 50577408 bytes at 0x0000000800000000
Loading classes to share ...
// ...snip ...
total   :  17538717 [100.0% of total] out of  46272512 bytes [ 37.9% used]

...и затем используйте его с

java -Xshare:on HelloJava

AOT : Компиляция в ожидании времени (Java 9 +)

Из блога mjg

Если CDS заранее выполняет некоторые части загрузки классов ядра, AOT фактически компилирует байт-код в собственный код (файл общего объекта в формате ELF) и может применяться к любому байт-коду.

Использование SubstrateVM (Java 8 +)

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

Из файла readme :

Substrate VM - это инфраструктура, которая позволяет заранее (AOT) компилировать приложения Java в предположении закрытого мира в исполняемые образы или общие объекты (ELF-64)или 64-битный Mach-O).

2 голосов
/ 21 мая 2017

Измените вашу программу на модель клиент / сервер, где Java-часть - это постоянный сервер, который запускается только один раз и питается клиентом, который сообщает ему, что делать. Клиент может быть небольшим скриптом Python, сообщающим процессу сервера, какие файлы использовать. Может быть, отправлять команды через сокет или сигналы, до вас.

2 голосов
/ 30 октября 2010

Гм ... записать документы в каталог (если они еще не созданы), и программа Java обрабатывает их все за один раз?

0 голосов
/ 30 октября 2010

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

например, почему бы просто не изменить программу Java для циклавсе файлы и обрабатывать их все в одном вызове JVM?

Или вы можете создать простое приложение с графическим интерфейсом в Swing и иметь какой-то визуальный способ запуска пакета (например, выберите целевые каталоги, затем нажмите «Обрабатывать все»).... ").

Или вы можете использовать Clojure REPL в качестве сценария выполнения соответствующего задания Java ....

Или выможет создать серверный процесс с чем-то вроде Netty и отправить все ваши файлы через него ....

...