2009年10月9日金曜日

&&より&のほうが速いか?

 trueが1になることを意識して最適化しようと思うとどうすればいいのかとアセンブラとにらめっこしていたが、


for (int i=0; i<100; ++i)
{
  num += (((i & 3)==0) && (num<100))!=0 ? 1 : 0;
}




for (int i=0; i<100; ++i)
{
  num += (((i & 3)==0) & (num<100))!=0 ? 1 : 0;
}


では、後者のほうが高速になると思われる。前者にはjgeとjmp,jiが含まれるが、後者にはjiしかない(forの分かと思う)。



 ほかに


for (int i=0; i<100; ++i)
{
  num += (((i & 3)==0) & (num<100)) ? 1 : 0;
}




for (int i=0; i<100; ++i)
{
  num += ((i & 3) == 0) & (num < 100);
}


だと、後者のほうが数命令少ないため、おそらく高速。実際、1億回回して時間を計ると後者が200ms程度速かった。

コンパイラ: VisualC++ 2005 Express Edition
CPU: Intel(R) Pentium(R) M processor 1400MHz
速度優先(/O2)で最適化してコンパイルした。


 よっぽどコアな部分のプログラムでもない限り意識する必要はないかと。速度が重要ならアルゴリズムを見直すほうが効果がある。

0 件のコメント: