Значительная потеря производительности при использовании IBM JVM в AIX 7

У меня есть следующий кусок кода:

        List<Long> array = new ArrayList<>();
        for (int i = 0; i < 30000; i++)
        {
            array.add(Long.valueOf(i));
        }
        for (int j = 0; j < 30000; j++)
        {
            for (int i = 0; i < 30000 - j; i++)
            {
                array.set(i, array.get(i) + j);
            }
        }

Когда я компилирую и запускаю его под Oracle JVM на моей локальной машине (JRE 1.7_0_71, Win 7, 64 бита, 4 ядра, 8 ГБ ОЗУ), я получаю время около 3,5 с для запуска.

1.run: 3446ms
2.run: 3485ms
3.run: 3546ms
4.run: 3721ms
5.run: 3573ms

Когда я запускаю его на компьютере AIX (POWER7+, 16 ядер, 64 ГБ ОЗУ) с IBM JVM (j9, java 7, сборка pap6470_27sr2-20141101_01(SR2)), я получаю результаты со скоростью почти 9 с за цикл.

1.run: 8518ms
2.run: 8548ms
3.run: 8499ms
4.run: 8486ms
5.run: 9235ms

Есть идеи, где можно поймать?

2 ответа

У вас есть 3 вопроса.

  1. Ваша архитектура процессора
  2. Ваш выбор операционной системы
  3. Ваш поставщик JVM

Из них наибольшее влияние в этом случае окажет IBM JRE, у которого действительно плохая производительность для циклов. Если бы вы работали с файлами, вы бы обнаружили, что это медленно из-за операционной системы. Существует много причин медлительности этой комбинации, лучше всего перейти на x86, Linux и Oracle.

Мы провели очень подробный анализ с использованием Dynatrace и обнаружили, что IBM JDK в Windows просто значительно превосходит тот же выпуск IBM JDK в AIX.

  • 20-30% на некоторых реальных тестах
  • 50-100% на других
  • 5-6x на некоторых тестах

Мы действительно улучшили AIX, перейдя с JDK 1.6 на 1.7. Исследования, похоже, показывают, что V8 снова немного замедлился.

Кажется, что потраченное время является фактическим временем процессора. IBM JDK в AIX, похоже, просто усердно работает над тем же объемом работы.

Другие вопросы по тегам