三角関数とパフォーマンス
ActionScriptのコーディングで三角関数とか三平方の定理とかを使ってる時ってややこしいんだけど、これぞAS!な感じがして個人的には好きです。
ここら辺のコーディングにはプリミティブ値だけで計算してしまう場合と、Mathクラスを使う場合、Pointクラスを使う場合、と色々なやり方が考えられます。条件次第では、Math.sin()などが必須になる場合もありますが、何を使っても良い場合、そのパフォーマンスはどうなんでしょうか?
と言うわけでベンチマークを取ってみました。
処理内容は下図の三角形から線分cの長さを求める。
これを上記三種のコーディングで記述するとこうなる↓
- Math.sqrt(a* a + b * b);
- b / Math.sin(θ);
- new Point(a, b).length;
これを1000万回くらいループしてやります。
すると、結果はこう↓
- Math.sqrt(a* a + b * b); ---- 2957 msec
- b / Math.sin(θ); ---- 3311 msec
- new Point(a, b).length; ---- 16353 msec
細かい実装方法は置いておいて、とりあえずプリミティブ値を計算しするのが一番早いことが解りました。Pointクラスはハッキリ言って戦力外。まあループ毎にnewしているので当然の結果だけど、newをループの外で実行してループ内で.lengthを参照する形にしても5,000msec以上かかっていたのでやっぱり遅い。
と言うわけでプリミティブ及びMathクラスが実行速度的には良さそう。ただココでも注意が必要。下記は計算結果で見て貰えば解るがb / Math.cos(θ);の計算結果だけ値が異なる。
- Math.sqrt(a* a + b * b); ---- 2.23606797749979
- b / Math.sin(θ); ---- 2.309401076758503
- new Point(a, b).length; ---- 2.23606797749979
これはAS3のNumber型の精度に起因する問題で、Math.cos(90*Math.PI/180)なども0にならない。Javaみたいに精度の高い浮動小数点型を持てば解決すんのかな。たとえばdoubleとか。
とりあえずそんな感じで。以上、報告おわり。