Low Level Optimization

low-level-optimization.png

* ループ展開

  • ++iはi++より速い
  • 割り算より掛け算の方が速い
  • pow(x,2)よりx*xの方が速い
  • 配列に直接アクセスするよりも、一旦変数に入れるとキャッシュが効いて速くなる

整数の正負を計算する速い方法

int v;//この変数の正負が知りたい
int sign;//結果はこの変数に格納する
sign=-(v<0)//これが一番最初に思いつくやり方ですが、、もっと速い方法があります
sign = +1 | (v >> (sizeof(int) * CHAR_BIT - 1));  // if v < 0 then -1, else +1
On the other hand, if you prefer the result be either -1, 0, or +1, then use:
 
sign = (v != 0) | -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
//もっとスピードを求めるなら but less portability:
sign = (v != 0) | (v >> (sizeof(int) * CHAR_BIT - 1));  // -1, 0, or +1
// Or, for portability, brevity, and (perhaps) speed:
sign = (v > 0) - (v < 0); // -1, 0, or +1
//If instead you want to know if something is non-negative, resulting in +1 or else 0, then use:
sign = 1 ^ ((unsigned int)v >> (sizeof(int) * CHAR_BIT - 1)); // if v < 0 then 0, else 1
Bibliography

サポートサイト Wikidot.com