3
我測試了三個C++程序代碼,其中將數據從內存加載到CPU,執行簡單的+或x操作(在此計算時間),然後報告結果。這三個代碼具有相同的結構,但具有不同的數據類型(int,double,float)。編譯器優化如何影響數據加載速度?
測試結果是:當兩個代碼的數據大小都是2倍時,時間是2倍。
但是,我有以下意見。
觀察1:當不使用優化時,時間減慢2倍。但是,由於加載時間(瓶頸)不應該受編譯器影響,這很奇怪。觀察2:當不添加編譯器優化並且數據大小固定(256MB,512MB,1024MB,2048MB,512MB)時,雙類型程序代碼的時間比整型和浮點類型程序代碼快兩倍。 4096MB)。這也很奇怪,因爲double應該是最慢的一個。
備註觀察2:當我添加編譯器優化(O,O2,O3)時,這三個代碼的時間是相似的。
的attched代碼是在這裏:
int main()
{
float value;
double totalTimeDifference;
const int numberOFElements=178956970; //4GB for 6 arrays in total
float*FLOAT_Array_one=new float[numberOFElements];
float*FLOAT_Array_two=new float[numberOFElements];
float*FLOAT_Array_three=new float[numberOFElements];
float*FLOAT_Array_four=new float[numberOFElements];
float*FLOAT_Array_five=new float[numberOFElements];
float*FLOAT_Array=new float[numberOFElements];
srand(time(NULL));
for(int i=0;i<numberOFElements;i++)
{
FLOAT_Array_one[i]=rand()% 400;
FLOAT_Array_two[i]=rand()% 400;
FLOAT_Array_four[i]=rand()% 400;
FLOAT_Array_five[i]=rand()% 400;
}
timeval tim1;
timeval tim2;
gettimeofday(&tim1,NULL);
//****************************//
for(int i=0;i<numberOFElements;i++)
{
FLOAT_Array[i]=FLOAT_Array_one[i]+FLOAT_Array_two[i];
}
//****************************//
//****************************//
for(int i=0;i<numberOFElements;i++)
{
FLOAT_Array_three[i]=FLOAT_Array_four[i]*FLOAT_Array_five[i];
}
//****************************//
gettimeofday(&tim2,NULL);
double t1=tim1.tv_sec+(tim1.tv_usec/1000000.0);
double t2=tim2.tv_sec+(tim2.tv_usec/1000000.0);
for(int i=0;i<numberOFElements;i++)
{
if(i%2==0)
value=value+FLOAT_Array[i]+FLOAT_Array_three[i];
else
value=value-FLOAT_Array[i]-FLOAT_Array_three[i];
}
totalTimeDifference=t2-t1;
cout<<value<<endl;
cout<<totalTimeDifference<<endl;
}
惡魔的細節。如果沒有看到代碼(並且猜測生成的程序集),我們只能猜測實際發生的事情。 – Mat
非優化代碼的時序並不令人感興趣,因爲您告訴編譯器「不要急於使其更快」。所以它不會,程序可能包含大量不必要的代碼。 –
我在這裏添加了代碼。這是浮動版本。 – user295106