2012-06-06 3 views
6

У меня есть Java-программа, которая считывает множество входных данных из базы данных, обрабатывает ее, а затем записывает данные обратно в другую базу данных (используя драйверы ODBC, базы данных Excel и доступа на новую машину Windows 7). Программе требуется около 17 минут для запуска из eclipse, но когда я создал исполняемый файл .jar, для запуска требуется еще 10 минут (всего 27).Почему мой .jar-файл работает медленнее, чем программа в eclipse?

Две причины, которые я нашел до сих пор для медленных файлов jar (путем поиска SO и google), это то, что они сжаты и что требуется много времени для записи в командную строку (или журнал ошибок), чем консоль в затмении. Я попытался создать несжатый файл jar, и он ускорялся примерно на 10 секунд (что могло быть совершенно случайным, так как время запуска варьируется примерно на 30 секунд). У меня есть только около 10 System.out.println() команд в программе, так что это не должно сильно замедлять ее.

Любые идеи относительно того, что заставляет его работать намного медленнее, и если есть какой-либо способ, я могу ускорить его снова? Сообщите мне, есть ли какие-либо другие детали, которые могут иметь значение, которые я должен включить. Благодаря!

+2

Вы пытались полностью удалить все команды System.out.println()? Печать на консоль съедает большую скорость. –

+3

Я предлагаю использовать логгер или библиотеку log4j для печати сообщений журнала, и вы можете использовать отметку времени, чтобы узнать, какая часть вашего кода создает узкое место. Это не конкретное решение, но оно должно помочь сузить проблему. – user845279

+0

Согласен с @Lai Xin Chu. Но если удалить все распечатки, просто запустите свою программу и перенаправьте STDOUT в файл. Я не верю, что консоль Eclipse может работать медленнее, чем оболочка. – AlexR

ответ

4

JAMon. Это контрольная библиотека, которая поможет вам измерить время выполнения кода.

После того, как вы добавите некоторый код мониторинга в свои методы, запустите его в Eclipse и как файл JAR и сравните результаты. Это должно позволить вам сузить поиск.

Также: проверьте, работает ли ваш JAR-файл с той же версией Java, что и Eclipse (например, Java 1.4.x может быть намного медленнее, чем 1.6.x).

1

Вы можете проверить параметры Java VM (например, GC, максимальная память и т. Д.). Для приложений с интенсивным использованием данных GC может значительно замедлить работу.

2

В моем случае мое приложение заняло 3 секунды, чтобы работать на затмении, пока оно заняло 2 минуты, когда я запускаю его из банки.
Моя ошибка заключалась в том, чтобы выбрать "Package required libraries into jar" при экспорте моего проекта в запущенную банку.

Я пробовал различные способы, чтобы сбить время, но ничего не помогло, кроме ..

Если у вас есть других зависимостей Maven или опарника в вашем проекте, вы должны использовать "**Extract required libraries into generated jar**" при экспорте проекта в банку ,

Это решение моей проблемы в секундах & теперь и мой eclipse & jar-файл принимает одно и то же время для запуска приложения, 2 сек.

Надеюсь, что это поможет новым борцам.

С уважением.

+1

То же самое здесь, работает в затмении было хорошо (почти мгновенно), в банке процесс был на 4 минуты позади. ваше предложение решило мою проблему – benez

2

У меня была аналогичная проблема. Оболочка работала на порядки медленнее, и она не имела ничего общего с выходом консоли. Я попытался установить значения памяти JVM, но это не имело никакого значения.

Решение заключалось в том, чтобы упаковать ANT-файл со всеми JAR-файлами во внешнюю папку, используя «Копировать необходимые библиотеки в подпапку рядом с сгенерированным JAR "в мастере« Runnable JAR File Export ». Затем запустите основной JAR с помощью командной строки -cp [YOURSUBFOLDER].

+0

Спасибо за это! По-видимому, это также оказывает огромное влияние на класс FXMLLoader JavaFX, заставляя его работать примерно в 10 раз медленнее с «упакованным банком» и что, хотя файлы уже были распакованы уже ... – DragonGamer

+0

То же самое и здесь, нужен '-cp', поскольку файл манифеста уже указывает местоположение суб-JARs – golimar

Смежные вопросы