次のJavaテストを書きました
public class NegativeTest {
/**
* @param args
*/
public static void main(String[] args) {
long start = System.currentTimeMillis();
int value = 12345;
for (int j = 0; j < 30; j++) {
for (int i = 0; i < 1000000000; i++) {
value = value * -1 - i;
}
}
System.out.println(System.currentTimeMillis() - start);
//to avoid compilation optimization
System.out.println(value);
}
}
私の Intel(R) Core(TM) i5-3210M (Ivy-Bridge) マシンで完了するのに約1.3 秒かかりましたが、行を変更した後
値 = 値 * -1 - i
に
値 = 値 - i、
その後、完了するまでに約10秒かかりました(以前のバージョンの約10倍の長さ)!
このテストを Sandy Bridge 以外の CPU で実行すると、結果は完全に逆になりました:値 = 値 * -1 - iバージョンは、値 = 値 - iバージョン の 2 倍の時間がかかります!
誰でもこの違いを説明できますか? Sandy Bridgeアーキテクチャの特定の最適化設計に関連していますか??