Речь идет не о времени компиляции, а о времени выполнения.
Компилятор Eclipse и javac
, используемые IntelliJ IDEA, генерируют другой байт-код с использованием различных оптимизаций ,Также в командной строке вы получите эти разные времена выполнения, если вы скомпилируете код Java с двумя компиляторами и выполните его на одной и той же виртуальной машине Java.
Например, внутренний цикл square(int)
for (int j = 0; j < n; j++)
operation();
компилируется Eclipse в
L4
GOTO L5
L6
INVOKESTATIC Snippet.operation() : void
IINC 2: j 1
L5
ILOAD 2: j
ILOAD 0: n
IF_ICMPLT L6
, тогда как javac
создает следующий байт-код:
L4
ILOAD 2: j
ILOAD 0: n
IF_ICMPGE L5
INVOKESTATIC Snippet.operation() : void
IINC 2: j 1
GOTO L4
L5
Семантически оба являются одинаковыми, но переход (GOTO
) выполняется только для j = 0
в байт-коде, созданном Eclipse, а GOTO
выполняется 349 999 раз в байт-коде, созданном javac
.В сочетании машинного кода, генерируемого Java VM, и оптимизаций процессора (особенно встраивания и прогнозирования ветвлений) это может привести к очень разным временам выполнения, как в этом случае (я предполагаю, что в одном случае статическое поле counter
обновляется только один раз, а в другом случае - 350 000 x 350 000).
IntelliJ IDEA поставляется с (более старой версией) компилятором Eclipse, который по умолчанию не используется.Поэтому с использованием компилятора Eclipse должен создать тот же байт-код.