Почему моя программа Java работает в 4 раза быстрее через Eclipse, чем через оболочку? - PullRequest
7 голосов
/ 26 августа 2011

Когда я выполняю приведенный ниже простой пример кода через Eclipse (версия 3.5.2, в Ubuntu 10.04, версия Java "1.6.0_20", среда выполнения OpenJDK (IcedTea6 1.9.9) (6b20-1.9.9-0ubuntu1 ~ 10.04).2) OpenJDK Server VM (сборка 19.0-b09, смешанный режим)), это занимает около 10 секунд.Когда я запускаю его из своей оболочки (используя тот же приоритет и версию Java), это занимает около 40 секунд.

for (int i = 0; i<1000*1000; i++) {
  System.out.println(Math.cos(i));
}

Я также пробовал другие программы, различающиеся по времени выполнения и объему вывода: каждая из них была намного медленнее в оболочке.Это не зависело от порядка исполнения.Минимальная разница в процентах составила 85 секунд в Eclipse против 145 секунд в оболочке для программы с очень небольшим выходным сигналом.

В чем причина?

Ответы [ 4 ]

19 голосов
/ 26 августа 2011

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

Попробуйте перенаправить вывод вашей программы в файл или / dev / null и рассчитайте время.

В моей системе это немного меняет ваш маленький цикл:

$ time java T
 --snip - 1M lines of output--

real    0m24.746s
user    0m2.403s
sys     0m1.597s

$ time java T >output

real    0m5.172s
user    0m2.800s
sys     0m2.707s
6 голосов
/ 26 августа 2011

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

Просто перенаправьте весь вывод в файл, и вы не будетеувидеть больше разницы.

4 голосов
/ 26 августа 2011

На ум приходят две возможности.Во-первых, в Eclipse механизм Java уже запущен;возможно, запуск из оболочки влечет за собой значительные затраты при запуске.Попробуйте синхронизировать только сам цикл (используя System.currentTimeMillis()).

Во-вторых, возможно, ваша конфигурация такова, что Java, запущенная из оболочки, отключила JIT.Это может значительно замедлить программу.Проверьте переменные среды на наличие всего, что может отключить JIT-компилятор.

2 голосов
/ 26 августа 2011

Как вы измеряете время?Используя System.nanoTime()?(Если вы измеряете время извне, имейте в виду время для начальной загрузки виртуальной машины).

Попробуйте сделать следующее:

  • Измените основной метод, чтобы выполнить прогрев прогонасначала без времени записи.
  • Затем измерьте время для нескольких других прогонов, используя System.nanoTime().
  • Посмотрите, есть ли существенная разница в производительности между усредненным временем, измеренным с консоли и Eclipse.
...