C言語速度最適化のポインタ付与とif判断
4399 ワード
最近書いているプロジェクトでは処理速度を最適化する必要がありますが、ポインタの付与値とポインタの判断速度の比較をテストするプログラムを書きました.結果は私を驚かせた.
結果は次のとおりです.
私はまた数回実行したが,いずれも前のプログラムが後のプログラムブロックより40~50 ms程度であった.私がforサイクルでずっと同じ値を与えていたためか、コンパイラは相関最適化をしたが、そうすれば40~50 msしか速くないはずがない.第1部のプログラム本体は次のとおりです.
第1部のプログラム本体は次のとおりです.
テスト環境は,DevC++と同様に,ポインタが指すアドレスに毎回アクセスした結果,判定よりも付与が速かった.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[]) {
int j;
int * tmp;
clock_t start = clock();
int i=0;
tmp=malloc(sizeof(int *));
for(;i<100000000;i++){
tmp[0]=2324;
tmp[1]=32423;
tmp[2]=90123;
tmp[3]=23421;
}
clock_t end = clock();
printf(" : %ld ms
",end - start);
start = clock();
i=0;
for(;i<100000000;i++){
if(tmp[0]==2356){
j=9089;
}
if(tmp[1]==234){
j=7812;
}
if(tmp[2]==2342){
j=2345;
}
if(tmp[3]==23423){
j=12032;
}
}
end = clock();
printf(" : %ld ms",end - start);
return 0;
}
結果は次のとおりです.
: 296 ms
: 344 ms
私はまた数回実行したが,いずれも前のプログラムが後のプログラムブロックより40~50 ms程度であった.私がforサイクルでずっと同じ値を与えていたためか、コンパイラは相関最適化をしたが、そうすれば40~50 msしか速くないはずがない.第1部のプログラム本体は次のとおりです.
for(;i<100000000;i++){ tmp[0]=2324; tmp[1]=32423; tmp[2]=90123; tmp[3]=23421; }
第1部のプログラム本体は次のとおりです.
for(;i<100000000;i++){ if(tmp[0]==2356){ j=9089; }
if(tmp[1]==234){ j=7812; }
if(tmp[2]==2342){ j=2345; }
if(tmp[3]==23423){ j=12032; }
}
テスト環境は,DevC++と同様に,ポインタが指すアドレスに毎回アクセスした結果,判定よりも付与が速かった.