2013-10-05 53 views
4

我正在考慮以下C++程序:32位和64位:大規模運行時差分

#include <iostream> 
#include <limits> 


int main(int argc, char **argv) { 
    unsigned int sum = 0; 
    for (unsigned int i = 1; i < std::numeric_limits<unsigned int>::max(); ++i) { 
     double f = static_cast<double>(i); 
     unsigned int t = static_cast<unsigned int>(f); 
     sum += (t % 2); 
    } 
    std::cout << sum << std::endl; 
    return 0; 
} 

我使用的gcc /克++編譯器,G ++ -v給出gcc版本4.7.2 20130108 [GCC-4_7-分支修訂版195012](SUSE Linux)。 我運行的是openSUSE 12.3(x86_64),並且有一個Intel(R)Core(TM)i7-3520M CPU。

運行

g++ -O3 test.C -o test_64_opt 
g++ -O0 test.C -o test_64_no_opt 
g++ -m32 -O3 test.C -o test_32_opt 
g++ -m32 -O0 test.C -o test_32_no_opt 

time ./test_64_opt 
time ./test_64_no_opt 
time ./test_32_opt 
time ./test_32_no_opt 

產生

2147483647 

real 0m4.920s 
user 0m4.904s 
sys  0m0.001s 

2147483647 

real 0m16.918s 
user 0m16.851s 
sys  0m0.019s 

2147483647 

real 0m37.422s 
user 0m37.308s 
sys  0m0.000s 

2147483647 

real 0m57.973s 
user 0m57.790s 
sys  0m0.011s 

使用浮動而不是雙,優化的64位變體甚至在完成2.4秒,而其他的運行時間留大致相同。然而,隨着float的不同,我會根據優化獲得不同的輸出,這可能是由於更高的處理器內部精度。

我知道64位可能有更快的數學,但我們有一個因子7(和近15浮點數)在這裏。

我將不勝感激這些運行時間差異的解釋。

+0

標杆是有意義的。我相信,即使在'-m32'中,'double'也是8個字節。 –

回答

5

問題不在於32位與64位,而是缺少SSE和SSE2。當編譯爲64位時,gcc認爲它可以使用SSE和SSE2,因爲所有可用的x86_64處理器都具有它。

使用-msse -msse2編譯您的32位版本,運行時差異幾乎消失。

我的完整性基準測試結果:要求編譯器優化,只有當

-O3 -m32 -msse -msse2  4.678s 
-O3 (64bit)    4.524s 
+0

爲獲得最佳效果,請使用「-m32 -march = native」。 – kfsone

+0

爲了獲得最佳效果,請使用「-m32 -march = native」(對於編輯max的評論感到抱歉) – kfsone