>>41 長さが決まってれば、引数にその長さが適応できるから、たとえば var tmp = new Array(5); for (var i = 0; i < 5; i++) { tmp[i] = "hoge"; } みたいにすれば、push を使わなくても配列に値を代入できるから パフォーマンスが上がるかなと…。
43 :
そうですね()
44 :
これは為になった
45 :
えっ
46 :
2レスしか持たなかったか
47 :
決まってるからってnew Array使ってたら統一性がないだろ var arr = []; arr.length = 5; でおk
計ってみました。「451,322」「451,323」「451,319」で、1.5倍は違わない ようでした。自分の手元の環境では。 <!DOCTYPE html><html><head><title>???</title><body> <pre><script type="text/javascript"> var x; function test(n) { if(n > 0) { test(n-1); return; } var y; x = y = 0; var t0 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { ++x; } var t1 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { ++y; } var t2 = new Date().getTime(); document.writeln((t1-t0) + ", " + (t2-t1)); } test(0); test(100); test(500); </script></pre></body></html>
77 :
PC環境やブラウザによってぜんぜん違うんだからそれを書かなきゃ意味がない
78 :
Mac OS X 10.6.4 2.53GHz Core Duo 2 Safari 5.01 でもどの環境/ブラウザでも「相対的な違いは」そんなもんじゃないですかね?
何も計らないよりはましでしょ。参照がよければ参照に直して計れば いいんだし。計ってみましたが。 var x; function test(n) { if(n > 0) { test(n-1); return; } var z, y; x = y = 0; var t0 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = x; } var t1 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = y; } var t2 = new Date().getTime(); document.writeln((t1-t0) + ", " + (t2-t1)); } test(0); test(100); test(500); 279, 283 284, 289 285, 284 つまり参照だけにしたら「ほとんど差はない」という結果になりました。
最適化で削られているかどうかは、次のようなコードで試せば 分かるわけで。同環境で確かに時間は増えていますね。 <!DOCTYPE html><html><head><title>???</title><body> <pre><script type="text/javascript"> var x; function test(n) { if(n > 0) { test(n-1); return; } var z, y; x = y = 0; var t0 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = x; z = x; } var t1 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = y; z = y; } var t2 = new Date().getTime(); document.writeln((t1-t0) + ", " + (t2-t1)); } test(0); test(100); test(500); </script></pre></body></html> 365, 396 362, 401 362, 397 ちなみに最初の数字は1段の呼び出し、その後は100レベル、500レベルの 呼び出しの中で計測していますが、値はほとんど変わらんようですね。 チェーンを重ねるというのは何をしろというご指摘なのか伺わせて いただけますか。
入れ子スコープの変数を作ると違うのかと思いやってみました。 404, 323, 322 と、入れ子スコープの変数でも速度は違っていませんね。 もう少し考えてみます。 var g1 = 1, g2 = 2; function test() { var a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q; var z, l11 = 1, l12 = 2; if(1) { var a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q; var l21 = 3, l22 = 4; var t0 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = g1; z = g2; } var t1 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = l11; z = l12; } var t2 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = l21; z = l22; } var t3 = new Date().getTime(); document.writeln((t1-t0) + ", " + (t2-t1) + ", ", (t3-t2)); } } test();
アドバイスありがとうございます、evalですかなるほど。やってみました。 var g1 = 1, g2 = 2; function test100() { var l1 = 1, l2 = 2; var t0 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = g1; z = g2; } var t1 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = l1; z = l2; } var t2 = new Date().getTime(); document.writeln((t1-t0) + ", " + (t2-t1)); } var d = "var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;"; for(var i = 0; i < 100; ++i) { eval("function test"+i+"() { "+d+"test"+(i+1)+"(); }"); } test100(); test0(); でもどっちも「675, 555」「675, 559」と同じです。何が足りないんでしょ?
89 :
意味不明なJavascriptの挙動に出くわした function sapporo(){ var number=0; var red=$("input"); for(var i=0;i<$("input").length;i++){ var name="i_"+i; if( red[i].id===name){ number++; } } return number; } inputタグのの中でid="i_0"〜"i_4"の数を数える関数なのですが、 formのid="i_0"〜"i_4"付きのinputタグの他に <form method="POST" action="test.cgi"> 名前: <input type="text" name="NAME"><br> 住所: <input type="text" name="ADDR"><br> <input type="submit" value="送信"> </form>
やってみました。やっぱ local < global < 中間ですね。 528, 728, 674, 398 となりました。まだ勘違いあったら教えてくださいませ。 var z, g1 = 1, g2 = 2; function test() { var o1 = 1, o2 = 2; var f = function() { var m1 = 1, m2 = 2; return function() { var l1 = 1, l2 = 2; var t0 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = g1; z = g2; } var t1 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = o1; z = o2; } var t2 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = m1; z = m2; } var t3 = new Date().getTime(); for(var i = 0; i < 100000000; ++i) { z = l1; z = l2; } var t4 = new Date().getTime(); document.writeln((t1-t0) + ", " + (t2-t1), ", " + (t3-t2) + ", " + (t4-t3)); }; }; return f(); } test()();
94 :
tvrockの自動検索予約リストの「予約数」の列を「タイトル・詳細」の左隣に移動させたいのです 単純に羅列したのは動いたのですがfor文で回すにはどうしたいいんでしょうか? 下のやつだと動作しません var rec1 = document.evaluate('/html/body/table/tbody/tr[2]/td/table[2]/tbody/tr/td[8]', document, null, 7, null); 略 var rec100 = document.evaluate('/html/body/table/tbody/tr[2]/td/table[2]/tbody/tr[100]/td[8]', document, null, 7, null); rec1.snapshotItem(0).parentNode.insertBefore(rec1.snapshotItem(0), rec1.snapshotItem(0).parentNode.lastChild); 略 rec100.snapshotItem(0).parentNode.insertBefore(rec100.snapshotItem(0),rec100.snapshotItem(0).parentNode.lastChild); ↓ var rec= document.evaluate('/html/body/table/tbody/tr[2]/td/table[2]/tbody/descendant::tr/td[8]', document, null, 7, null); for (var i=0; i<rec.snapshotLength; i++){ rec[i].snapshotItem(0).parentNode.insertBefore(rec[i].snapshotItem(0),rec[i].snapshotItem(0).parentNode.lastChild); }