1
我寫了下面的Java測試通過Sandy-Bridge CPU進行優化?
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);
}
}
花了約1.3秒完成我的英特爾(R)酷睿(TM)i5-3210M(常春藤橋)機,但之後我改了行
值=值* -1 - I
到
值=值 - 我,
然後花了大約10秒完成(大約是以前版本的10倍)!
當我跑到其他非的Sandy Bridge CPU的這個測試,結果是完全顛倒過來: 的值=值* -1 - 我版本需要兩倍長的值=價值 - 我版本並!
任何人都可以解釋這種差異?它與Sandy Bridge架構中的任何特定優化設計有關?
那麼這很有趣。當我在C++中嘗試這個時,第一個情況是0秒,第二個是7.472秒。看起來,在第一種情況下,我的C++編譯器設法將循環完全優化爲單個值。所以這基本上歸結爲編譯器優化。也許Java JIT爲SB做了一些不同的事情。 (哦,我測試了它在Sandy Bridge機器上) – Mysticial
@Mysticial你在非沙質橋式機器上嘗試過嗎? – njzhxf
這沒關係。因爲我的C++編譯器將第一種情況優化爲基本'print(「 - 2115085767」)'。這將在任何處理器上零時間運行。 – Mysticial