Fork me on GitHub

2009/01/14

Recent entries from same category

  1. Google+でとりあえず全部+1押しちゃうブックマークレット書いた。 Hatena
  2. スコープと参照と... Hatena
  3. JScript.NETでスレッド Hatena
  4. javascriptで動くtwitter streamクライアントを作るならばmultipart/mixedを使うべき Hatena
  5. バッチファイルで簡易Webサーバを起動する。 Hatena

このエントリーをはてなブックマークに追加
追記
事情が変わった!(髭男爵)
変わってなかった...orz
詳細は下記。

おもしろい。
static - 素人がプログラミングを勉強するブログ
var counter = function () {
  var static = /(^o^)/;
  return ('i' in static)? ++static.i:
    static.i = 0;
};

console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
http://d.hatena.ne.jp/javascripter/20090113/1231863436
正規表現リテラルがコンパイル時に生成され、静的保持される特性を利用したカウンタ。

でも使わない。気持ちワルイ!苦笑
皆、思いつくだろうけど私はやっぱりこう書く。
var counter = (function() {
  var static = 0;
  return function() {return static++};
})();

ちなみにベンチを取ってみた。
if (typeof console == 'undefined') console = {log:print};

var counter1 = function () {
  var static = /(^o^)/;
  return ('i' in static)? ++static.i:
    static.i = 0;
};

var counter2 = (function() {
  var static = 0;
  return function() {return static++};
})();

var start;
start = new Date().getTime();
for(var n = 0; n < 10000000; n++) counter1();
console.log(new Date().getTime() - start)

start = new Date().getTime();
for(var n = 0; n < 10000000; n++) counter2();
console.log(new Date().getTime() - start)
Windows XP、P4 3GHz CPU、1G Mem。

tracemonkey : JavaScript-C 1.8.0 pre-release 1 2007-10-03
6515
5500

v8 : V8 version 0.3.4 (internal)
1558
383

ま、やっぱりね...というところ。
結論
V8はえーーー!

追記 os0xさんから
var counter1 = function () { var static = /(^o^)/; return ++static.i || (static.i=0); }; こうすれば差は縮まる http://la.ma.la/blog/diary_200705301141.htm
とブックマークコメントを貰った。
counter3としてベンチに追加した所、結果が変わった
if (typeof console == 'undefined'{
  if (typeof print == 'function') console = {log:print};
  else if (typeof WScript != 'undefined') console = {log:function(s){WScript.StdOut.WriteLine(s)}};
  else console = {log:alert};
}

var counter1 = function () {
  var static = /(^o^)/;
  return ('i' in static)? ++static.i:
    static.i = 0;
};

var counter2 = (function() {
  var static = 0;
  return function() {return static++};
})();

var counter3 = function () {
  var static = /(^o^)/; return ++static.i || (static.i=0);
};

var start;
start = new Date().getTime();
for(var n = 0; n < 10000000; n++) counter1();
console.log("counter1:" + (new Date().getTime() - start))

start = new Date().getTime();
for(var n = 0; n < 10000000; n++) counter2();
console.log("counter2:" + (new Date().getTime() - start))

start = new Date().getTime();
for(var n = 0; n < 10000000; n++) counter3();
console.log("counter3:" + (new Date().getTime() - start))
さらにベンチにwindows scripting hostも足してみた。

tracemonkey : JavaScript-C 1.8.0 pre-release 1 2007-10-03
counter1:1624
counter2:381
counter3:529

v8 : V8 version 0.3.4 (internal)
counter1:1610
counter2:403
counter3:665

cscript : Microsoft (R) Windows Script Host Version 5.6
counter1:107282
counter3:44016
counter2:51297

おぉぉぉぉぉぉぉぉぉぉ!!!!なんと
正規表現オブジェクトの方が速いではないか!!!
詳細はos0xさんか何方かが書いてくれるとして...
失礼しました!!!
上の結果が正しいです。

結論
windows scripting hostおせーーー!

Posted at 15:03 in ソフトウェア::lang::javascript | Edit
Tagged as: javascript
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

blog comments powered by Disqus