2013年5月3日金曜日

よくわかる最適化

shi3z氏のプログラム最適化の具体的な手順を綴った記事が面白い。
http://d.hatena.ne.jp/shi3z/20130502

現状自分はプログラムをテスタブルにすることくらいしか意識していないが、この人は
Cかな?プログラムの速度を以下に速くしていくかに関してのチューニング方法に関して
具体的な記載をしている。

頭の整理も兼ねて最適化の観点に関してまとめてみると、

・除算は乗算に変える

☓float v0 = (p2 - p0) / 2.0f ;
○float v0 = (p2 - p0) * 0.5f ;

・同じ掛け算は極力一つにまとめる
☓return v0 * t * t + v1 * t * t * t;
○float t2 = t * t;return (v0 + v1 * t) * t2;

・加算にできるのであれば乗算を加算にする
☓for(int i = 0; i < num; i++) {
 x = func(i * num);
}
○float arg = 0;
for(int i = 0; i < num; i++, arg += num) {
 x = func(arg);
}

・分岐は極力排除する。分岐は平方根計算よりも遅い

・関数呼び出しは極力排除。メイン関数の中に展開する
→これは現場によって考えが分かれそう。異動の多い複数人でコードのメンテを職場で、
これやると読みにくいし、テストも書きにくくなるし結構きつい・・

というところかな。