まず比較対象。昨日までは
Decompress: 42.09ms
タイマーを使っていろいろ調べた結果、ネックになってたのが new 演算子。
struct TComplStack { TComplStack() : x(0), y(0), pattern(0) { } TComplStack( int _x, int _y, u_char _pattern ) : x(_x), y(_y), pattern(_pattern) { } int x, y; u_char pattern; };
こんな構造体がありましてね。
boost::shared_array<TComplStack> CStack( new TComplStack[ width * height ] );
とか確保してたわけです。
画像が 640x480 で実験してるので、コンストラクタは 307200 回呼ばれることに!!
この構造体の配列は、前から順に書き込んでいって、書き込んだ数を記録してあるので初期化は不要。
よって以下のように改善。
u_char* buffer = new u_char[ width * height * sizeof(TComplStack) ]; boost::shared_array<TComplStack> CStack( (TComplStack*)buffer );
これで
Decompress: 32.33ms
約10ms の高速化。