« エラーレポートに WMI から取得した情報を含める | メイン | TMPGEnc 再質問回答 »

2008年02月02日

日常の備忘録:: 小手先の最適化は遅くなる?

    

まず、以下のようなコードがあったとする。

float CalculateGradients( FloatImage& H, FloatImage& G, int k )
{
  int width = H.width();
  int height = H.height();
  float divider = pow( 2.0f, k+1 );
  float avgGrad = 0.0f;

  forint y = 0; y < height; y++ ) {
    forint x = 0; x < width; x++ ) {
      int w = (x == 0 ? 0 : x-1);
      int n = (y == 0 ? 0 : y-1);
      int s = (y+1 == height ? y : y+1);
      int e = (x+1 == width ? x : x+1);

      float gx = ( H[y][w] - H[y][e] ) / divider;
      float gy = ( H[s][x] - H[n][x] ) / divider;

      G[y][x] = sqrt( gx * gx + gy * gy );
      avgGrad += G[y][x];
    }
  }
  return avgGrad / (width*height);
}

このコードを見ると、ループ内に判定があって、その判定が一番端でしか成立しないのは見てすぐにわかる。
ループ内に判定があると遅いので、この判定を外に出して最適化を試みようとしてしまったりする。
が、それは止めた方が良い。
VC2005で外に出したものとそうでないもので速度を計測したところ、外に出したほうが 10%ほど遅かった。
最近の最適化はかなり賢いようだ。
小手先の最適化はかえって遅くなってしまうかもしれない。
今回計ってみてそのことに気付いた。
私は、こういうコードがあるとつい判定文を外に出してしまいがちなのだが、きちんと計測して速くなったかどうか見たほうが良いようだ。



投稿者 Takenori : 2008年02月02日 01:27




comments powered by Disqus
Total : Today : Yesterday : なかのひと