どこかのつぶやきから
kyuridenamida ++++iとi+=2;ってどっちが速いんですか
聞く暇あんならベンチマークとりゃれdしあいsdじょじおfsl;
VC++ 2010で動作
#include <iostream> #include <time.h> void main(void){ const unsigned int loop = 500000000; unsigned int i; clock_t s,e; int sum; sum = 0; s = clock(); for(i=0; i<loop; ++i){ __asm{ INC sum INC sum } } e = clock(); std::cout << "[INC sum INC sum]sum: " << sum << "clock: " << (e-s) << std::endl; sum = 0 s = clock(); for(i=0; i<loop; ++i){ __asm{ ADD sum, 2 } } e = clock(); std::cout << "[ADD sum, 2]sum: " << sum << "clock: " << (e-s) << std::endl; }
[INC sum INC sum]sum: 1000000000 clock: 2421
[ADD sum, 2]sum: 1000000000 clock: 1204
ADD命令が意外と早かった。
ちなみに、2でなく1にした場合も、大きな差はありませんでした。
むしろ誤差レベルでADDのほうが早い事もありました。
単純に1加算するだけなら++、2以上の加算なら+=、という使い分け程度でいいかもしれません。
インラインアセンブラを使うと、最適化の対象にならないので、最適化した場合はーって考えなくていいのが良い。
ちなみにインラインアセンブラの部分を通常通りに++i;++i;とi+=2に戻すと、
最適化のために展開されてループが取っ払われて、0x3B9ACA00(1000000000)を代入して出力するだけになります。
もちろん実行結果は1ms未満で終わります。
こんなちょっとしたコードでも最適化されていると、正しいベンチマークをとるのが大変です。
どこで最適化されているか判らないから、こっちよりこっちのほうが早いのか、と思ってたら、定数展開して増したみたいな事がありそう。いや、あるだろう。
アセンブラをもっと理解しなければなぁ。最適化手法も考えたいね。
ただ、注意したいのは、
i++;とi+=1;で生成されるコードに大差はなくても、n=i++;とn=i+=1;では結果もコードも異なります。
要は使い時ですね。