読者です 読者をやめる 読者になる 読者になる

gotin blog

Whatever gotin wanna write

「分割してみる」を試してみたけど試し方がダメだったみたいでうまくいきませんでした

ということで私の無能さ加減をさらしてみます。

1) FirefoxはIEに比べて30bitを超える整数値の扱いが苦手である.場合によっては分割したほうがよいこともある.
2) 関数呼び出しは重たい.

分割してみる (mitsunari@cybozu labs)

ほぉなるほどぉ。と思って試してみました。
試し方は下のコードをFirebugにはっつけてRunしてみる方式で。

まずは愚直な方式

var time=new Date().getTime();
var x = 0;
for (var i = 0; i < 1000000; i++) {
  x += i;
}
var sum =  x;
sum + ":" + (new Date().getTime() - time);

結果は"499999500000:6997"

次に分割してみる (mitsunari@cybozu labs)の方法

var time=new Date().getTime();
var xL, xH, yL, yH;
xL = xH = yL = yH = 0;
for (var i = 0; i < 1000000; i++) {
  var t = xL += i;
  if (t >= (1 << 30)) {
    xL -= 1 << 30;
    xH++;
  }
}
var sum =  ((xH * (1 << 30)) + xL);
sum + ":" + (new Date().getTime() - time);

結果は"499999500000:8426"

最後に関数呼び出しも使うしxをそのまま使うオレオレ法

var time=new Date().getTime();
Number.prototype.times = function(func){
   for(var i=0;i<this;i++){
     func(i);
   }
};
var i=new Number(1000000);
var x = 0;
i.times(function(j){x += j;});
var sum =  x;
sum + ":" + (new Date().getTime() - time);

結果は"499999500000:5871"

これらのことから思うこと

  1. 私のやり方&計測方法がどこか間違っている
  2. Firebugだとうまく試せない(Firebugで試すこと自体が間違っている)
  3. 私のFirefoxはおかしい(verは2.0.0.6で、MacBook黒です)
  4. 関数呼び出しが意外と早い。なんか最適化とかされるのかな
  5. Number.prototype.timesって作ってみたけど使い道あるかな
  6. bit演算とか難しいことを理解しそれをきちんと試す力が私にはない

1.が一番気になるところです。元記事だと6倍の差が出ているようなので、おそらく私のやり方が間違っています。惑わされないようにしましょう。