Разные времена компиляции между IntelliJ и Eclipse IDE - PullRequest
0 голосов
/ 21 февраля 2019

Мой код выглядит следующим образом:

public static int counter = 0;

public static void operation() {
    counter++;
}

 public static void square(int n) {
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            operation();
} 

public static void main(String[] args) {
    System.out.println("Start...");
    long start = System.nanoTime();

    square(350000);

    long end = System.nanoTime();
    System.out.println("Run time: " + ((end - start) / 1000000)
            + " ms");
}

Я пытался запустить этот код с IntelliJ, и это заняло 6 500 мс, в то время как Eclipse был намного быстрее с 18 мс.Я использую Skylake CPU, Java 11. Оба настроены на одни и те же настройки, и я ничего не изменил в настройках.

Есть ли способ / Как я могу оптимизировать IntelliJ, чтобы получить те же результаты, что и Eclipse?

Спасибо.

1 Ответ

0 голосов
/ 21 февраля 2019

Речь идет не о времени компиляции, а о времени выполнения.

Компилятор 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 должен создать тот же байт-код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...