変わってなかった...orz
詳細は下記。
おもしろい。
static - 素人がプログラミングを勉強するブログ正規表現リテラルがコンパイル時に生成され、静的保持される特性を利用したカウンタ。
var counter = function () {
http://d.hatena.ne.jp/javascripter/20090113/1231863436
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
でも使わない。気持ちワルイ!苦笑
皆、思いつくだろうけど私はやっぱりこう書く。
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おせーーー!