2009/08/24

javascriptの数値計算を高速化

このエントリーをはてなブックマークに追加
javascriptだけじゃなくて、他の言語でも同じようなことです。
なお、javascriptの場合は、クライアントのスペック、および使用されるブラウザに依存する部分が強いようなので、必ずしも全てに当てはまらない可能性があるので注意してください。

なお、よく参照する関数は、var cos=Math.cosというようにあらかじめグローバル変数に代入しておくほうが、参照が減る分高速です。

●商
x/2よりx>>1のほうが高速。ただし、xは整数。同じように、乗算も、x*2よりもx<<1のほうが高速です。>Firefox3
x / 2 = 71
x * 0.5 = 70
x >> 1 = 64

->IE8
x / 2 = 156
x * 0.5 = 141
x >> 1 = 78

->GoogleChrome2
x / 2 = 6
x * 0.5 = 19
x >> 1 = 3

●べき乗
単純に平方を求めるなら、Math.powを使うより同じ数を二回掛けたほうが高速。
Math.pow(x,2)よりx*x。

1000000回テスト(単位はms)
※powはループ前に、var pow=Math.powとして計算したものです。

->Firefox3
Math.pow(x,2) = 321
pow(x,2) = 215
x * x = 95

->IE8
Math.pow(x , 2) = 531
pow(x , 2) = 328
x * x = 94

->GoogleChrome2
Math.pow(x,2) = 143
pow(x,2) = 136
x * x = 4

●小数点以下の切り捨て(いわゆる整数化)
Math.floor(x)よりも、x|0のほうが早い。

1000000回テスト(単位はms)
※ floorはループ前に、var floor =Math. floorとして計算したものです。

->Firefox3.0
Math.floor(x) = 249
floor(x) = 108
x | 0 = 128

->IE8
Math.floor(x) = 468
floor(x) = 219
x | 0 = 94

-> GoogleChrome2
Math.floor(x) = 64
floor(x) = 67
x | 0 = 17

●距離判定
点p1(x1,y1)と点p2(x2,y2)の距離dが、範囲rよりも小さいかどうかの判定だけなら、Math.sqrtを使わなくてもできる。

d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); // 距離の平方
r2 = r * r; // 範囲の平方
if(d2 < r2){
// 近い
}

0 件のコメント :

コメントを投稿