私は最近、マルチスレッド演算のためのフレームワークを作成し、それをテストするために千の素数の最初の2つを計算しました。Java 32ビットと64ビットの間の空のループで大規模なパフォーマンスの違い
しかし、私はより多くの時間を取るためにそれを必要とするので、私は素数の計算にこのコードを挿入:長い間
for (int i = 0; i < 1000000; i++)
{
// Nothing.
}
、私が書くと64ビットマシン上でコードをコンパイルし、それをテストしました32ビットマシンの数。
次に、64ビットマシンで実行し、大きなパフォーマンスの違いに気付きました。
完全に似た64台のマシンは、同じホスト上で2台の仮想マシンを実行するために、32台のマシンで何を使用するかは、< 100msです。
私は別のコンピュータにWindowsとUbuntu上でテストしてみた、と同じの.classファイルを使用して、私はまだ64ビット差対この巨大な32bit版を入手。
ここでは、パフォーマンスの違いを複製するためのクイックコードを示します。
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ビットの正常な(またはこれまで呼ばれていた)マシンでしたか? – MByD
私は、空のループがそれをベンチマークするための貧弱な方法であることを知っています。しかし、ポイントは、64ビットマシンで実行するかどうかによって、同じコンパイルされたファイルに大きなパフォーマンスの差があることです。 そして私はそれを仮想マシンと "ネイティブ"の64と32マシンでテストしました。 – Webbies