これ以上はどうしようもないので、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 製品版ほしいよー(>_<)