私の自由な時間に、私は最近、マルチスレッドの数学演算のフレームワークを作成し、それをテストするために、千の素数の最初の数を計算しました。
しかし、もっと時間がかかる必要があったので、このコードをプライム計算に挿入しました。
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;
}
}
今私の質問。
64ビットマシンを使用することでパフォーマンスが向上することは知っていますが、それではこの大きな違いを説明することはできません。それで、なぜこれが起こっているのか誰かが知っていますか?