gpt4 book ai didi

java - java 32 位和 64 位之间的空循环存在巨大的性能差异

转载 作者:行者123 更新时间:2023-12-01 07:37:49 26 4
gpt4 key购买 nike

在空闲时间,我最近制作了一个用于多线程数学运算的框架,为了测试它,我计算了前两个千个素数。

但是我需要花费更多时间,所以我将这段代码插入到素数计算中:

for (int i = 0; i < 1000000; i++)
{
// Nothing.
}

很长一段时间,我在64位机器上编写和编译代码,并在许多32位机器上进行测试。

然后我在 64 位机器上运行它,并注意到巨大的性能差异。

使用相同的代码,完全相似的 64 计算机需要 <100 毫秒才能完成,而 32 计算机需要约 52000 毫秒才能完成(同一主机上的 2 个虚拟机)。

我已经在不同计算机上的 Windows 和 Ubuntu 上进行了测试,并且使用相同的 .class 文件,我仍然得到了 32 位与 64 位的巨大差异。

这是一个快速代码,您可以使用它来复制性能差异。

import java.util.ArrayList;
import java.util.Collection;
public class Test {
public static void main(String[] args)
{
long start = System.currentTimeMillis();
int j = 2;
ArrayList<Integer> res = new ArrayList<Integer>();
for (int k = 0; k < 50000; k++)
{
Collection<Integer> partres = work(k);
if (partres != null)
res.addAll(work(k));
}
long end = System.currentTimeMillis();
System.out.println("Done in " + (end-start) + " ms.");
}
public static Collection<Integer> work(Integer j) {
for (int i = 0; i < 1000000; i++)
{
// Nothing.
}
if (isPrime(j))
{
ArrayList<Integer> res = new ArrayList<Integer>();
res.add(j);
return res;
}
else
return null;
}
static boolean isPrime(int n) {
if (n == 2) return true;
if (n%2==0) return false;
for(int i = 3; i * i <= n; i += 2)
if(n%i==0)
return false;
return true;
}
}

here is the .class file i compiled it to.

现在是我的问题。

我知道使用 64 位机器可以提高性能,但这并不能解释这种巨大的差异。那么有人知道为什么会发生这种情况吗?

最佳答案

64 位 Java 始终使用 -server JIT 编译器,而您的 32 位 JVM 可能使用 -client JIT 编译器。

当 C2 又名。 -服务器编译器看到这样的东西:

for (int i = 0; i < 1000000; i++)
{
// Nothing.
}

它会注意到循环不执行任何操作,并且将其删除!您不执行任何操作的循环将被优化为不执行任何操作。

为了阻止这种优化,您必须让循环执行某些操作 - 例如,它可以将所有这些 i 异或在一起 - 并利用结果。然后,对于编译器来说,循环将看起来像是真正的工作,并且代码将被保留。

关于java - java 32 位和 64 位之间的空循环存在巨大的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9353389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com