Значительная потеря производительности при использовании 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 вопроса.
- Ваша архитектура процессора
- Ваш выбор операционной системы
- Ваш поставщик 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, похоже, просто усердно работает над тем же объемом работы.