Cのモヤモヤの一つで、「1行の条件分岐」をする書き方をちらっと見かけてから、ずーっと分からずにいて、
つい最近「三項演算子」という言葉で知ったのです。
そして書き方をようやく習得して思ったこと。
通常の条件分岐と三項演算子とでは性能差はどのくらい違うのだろう
はい。思ったらやらねばなりません。
というわけで汚ねぃソースですがプログラム書いて確かめてみました!
使ったコンパイラはBorland Cです。
#include
#include
int main()
{
int i,j,max;
clock_t start,end;
double sa,to1,to2,total;
to1 = to2 = total = 0.0;
scanf("%d",&max);
for(j=0;j<max;j++){
printf("-------------------------------------------------------------------------------\n");
printf(" %d 回目のテストです。\n",j+1);
start = clock();
i = 100000000;
while(i){
if(i) i -= 1;
else i -= 0;
}
end = clock();
printf(" 条件分岐 : %.5f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
to1 += (double)(end-start)/CLOCKS_PER_SEC;
sa = (double)(end-start)/CLOCKS_PER_SEC;
i = 100000000;
start = clock();
while(i){
i -= (i) ? 1 : 0;
}
end = clock();
printf(" 三項演算子: %.5f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
to2 += (double)(end-start)/CLOCKS_PER_SEC;
sa -= (double)(end-start)/CLOCKS_PER_SEC;
if(sa < 0.0) printf(" ● %.5f秒 差で 条件分岐 の勝ち~\n",sa*-1.0);
else printf(" ○ %.5f秒 差で 三項演算子 の勝ち~\n",sa);
}
printf("\n\n 平均発表~♪\n");
to1 /= (double)j;
to2 /= (double)j;
total = to1 - to2;
printf(" 条件分岐 : %2.5f秒/1億回\n 三項演算子: %2.5f秒/1億回\n\n",to1,to2);
if(total < 0.0) printf(" ● %.5f秒 差で 条件分岐 の勝ちでした~\n",total*-1.0);
else printf(" ○ %.5f秒 差で 三項演算子 の勝ちでした~\n",total);
return 0;
}
……大して変わらず^^;
コードが悪いのかなあ。それとも内部処理的には全くかわりないのか。
はたまたC#とかになると違ってくるのでしょうかね。