INC命令とADD命令の速さ

どこかのつぶやきから

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;では結果もコードも異なります。
要は使い時ですね。