ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

展開速度の高速化その2


これ以上はどうしようもないので、Intel VTune 評価版を入手してきて解析。
その結果、limit() 関数にパーシャルストールを発見。


元々は

#define limit(a) ( a > 255 ) ? 255 : ( a < 0 ) ? 0 : a;

0〜255 に切り詰めを行うマクロだったのを、分岐を減らすために

inline short _fastcall limit(short par) {
	_asm {
		mov ax, par
		cmp ax, 0x8000
		sbb bx, bx
		and ax, bx
		add ax, 0xff00
		sbb bx, bx
		or ax, bx
		and ax, 0x00ff
	}
	return;
}

インラインアセンブラで書いてインライン展開させて高速化。


だったんだけども。

u_char temp = buffer.GetNextData();
u_char result = limit( temp + scale );

こんなコード書いてたりして。
関数入るとき&出るときで2回ずつパーシャルストールが発生。
DPCM.cpp で大量にこんなものを発見しちゃいました。

inline u_char _fastcall limit(int par) {
	_asm {
		mov eax, par
		cmp eax, 0x80000000
		sbb ebx, ebx
		and eax, ebx
		add eax, 0xffffff00
		sbb ebx, ebx
		or eax, ebx
		and eax, 0x000000ff
	}
	return;
}

こうやって型を統一することでパーシャルストールを回避。

結果、

 Decompress: 29.89ms

約3msの高速化。


たかが 3/1000秒 だけども元と比べると1割ですからね。
おかげでだいぶ再生がスムーズに。


Intel VTune 製品版ほしいよー(>_<)