我試圖測量VS雙精度除法在C++原因有和沒有opt.flag -O3(C++/C)不同的速度浮點除法的
這裏單精度除法的速度差是簡單我寫的代碼。
#include <iostream>
#include <time.h>
int main(int argc, char *argv[])
{
float f_x = 45672.0;
float f_y = 67783.0;
double d_x = 45672.0;
double d_y = 67783.0;
float f_answer;
double d_answer;
clock_t start,stop;
int N = 200000000 //2*10^8
start = clock();
for (int i = 0; i < N; ++i)
{
f_answer = f_x/f_y;
}
stop = clock();
std::cout<<"Single Precision:"<< (stop-start)/(double)CLOCKS_PER_SEC<<" "<<f_answer <<std::endl;
start = clock();
for (int i = 0; i < N; ++i)
{
d_answer = d_x/d_y;
}
stop = clock();
std::cout<<"Double precision:" <<(stop-start)/(double)CLOCKS_PER_SEC<<" "<< d_answer<<std::endl;
return 0;
}
當我編譯的代碼沒有優化,g++ test.cpp
我得到了下面的輸出
Desktop: ./a.out
Single precision:8.06 0.673797
Double precision:12.68 0.673797
但是,如果我編譯這與g++ -O3 test.cpp
然後我得到
Desktop: ./a.out
Single precision:0 0.673797
Double precision:0 0.673797
我怎麼會這樣劇烈的表現增加?由於clock()
函數的分辨率較低,第二種情況下顯示的時間爲0。編譯器是否檢測到每個循環迭代都獨立於以前的迭代?
我編輯了我的答案,給你一個性能測試優化器不能優化存在。它使用複數,因此對複數的每個簡單操作都涉及多個乘法,增加和減少基礎數據類型。 – Omnifarious
代替對這些值進行硬編碼,讀取它的運行時間並查看其差異,我猜的是編譯器優化,並在編譯時自己計算出值 – vrbilgi
@ user430294:即使您在運行時讀取這些值,編譯器會注意到它們在循環過程中永遠不會改變,並將循環優化爲一次「迭代」。 – Omnifarious