1

我有以下代码:

        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 64bit、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-20141101_01(SR2))的 AIX 机器(POWER7+、16 核、64GB RAM)上运行它时,每次运行我得到的结果几乎是 9 秒。

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

知道在哪里可以抓到吗?

4

2 回答 2

1

你有3个问题。

  1. 您的处理器架构
  2. 您的操作系统选择
  3. 您的 JVM 提供商

其中,在这种情况下影响最大的将是 IBM JRE,它的循环性能非常差。如果你在做文件工作,你会发现由于操作系统的原因它很慢。这种组合速度慢的原因有很多,最好的选择是迁移到 x86、Linux 和 Oracle。

于 2015-03-24T16:10:21.137 回答
0

我们使用 Dynatrace 进行了非常详细的分析,我们发现 Windows 上的 IBM JDK 远远优于 AIX 上相同的 IBM JDK 版本。

  • 在一些真实世界的测试中为 20-30%
  • 50-100% 其他人
  • 在某些基准上是 5-6 倍

通过从 JDK 1.6 迁移到 1.7,我们确实在 AIX 上得到了显着改进。研究似乎表明 V8 再次减速。

花费的时间似乎是实际的 CPU 时间。AIX 上的 IBM JDK 似乎只是更加努力地完成相同数量的工作。

于 2017-11-10T22:01:31.323 回答