我有以下代码:
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);
}
}
当我在本地机器(JRE 1.7_0_71,Win 7 64位,4核,8GB RAM)上的Oracle JVM下编译并运行它时,我的运行时间大约为3.5秒。
1.run: 3446ms
2.run: 3485ms
3.run: 3546ms
4.run: 3721ms
5.run: 3573ms
当我在带有IBM JVM(j9,java 7,build pap6470_27sr2-201411101_01(SR2))的AIX机器(POWER7+,16核,64GB RAM)上运行它时,每次运行的结果几乎是9。
1.run: 8518ms
2.run: 8548ms
3.run: 8499ms
4.run: 8486ms
5.run: 9235ms
知道在哪里可以抓吗?
您有3个问题。
- 您的处理器体系结构
- 您选择的操作系统
- 您的JVM提供程序
其中,在这种情况下,最大的影响将是IBMJRE,它对循环的性能非常差。如果你在做文件工作,你会发现由于操作系统的原因,速度很慢。这种组合导致速度缓慢的原因有很多,最好的选择是改用x86、Linux和Oracle。
我们使用Dynatrace进行了非常详细的分析,发现Windows上的IBM JDK在很大程度上优于AIX上的相同IBM JDK版本。
- 在一些真实世界的测试中获得20-30%
- 其他50-100%
- 在某些基准上为5-6x
通过从JDK1.6迁移到1.7,我们确实在AIX上得到了显著的改进。研究似乎再次表明V8有一些减速。
所花费的时间似乎是实际的CPU时间。AIX上的IBMJDK似乎只是更加努力地完成同样数量的工作。