元スレ+ JavaScript の質問用スレッド vol.104 +
JavaScript覧 / PC版 /みんなの評価 :
51 = :
>>49
ローカルスコープで試したら結果か変わると思う
スコープが深い程顕著に差が出るはず
58 = :
結局配列はnew Array()が最速なのか?
59 = :
これの場合何が最速なんてブラウザによって変わるんで、気にしない。
読みやすさを優先するのが吉だと思う。
60 = :
a.push(42); // 正解
a[a.length] = 42; // ← 筋が悪い。何やらせてもトロ臭い駄目なタイプ
61 = :
その程度の速さは0.000000001秒ぐらいだから気にすんな
正規表現もRegEXP使った方が早い早いってリファレンスでも言われてたけど
速度全く変わり無かったし、そんなもん
62 = :
>>60
前者の方が一目で解るし綺麗だからな
単にpush知らないだけかもしれんが
63 = :
>>58
だねえ。ちょっと驚いた。ArrayもObjectなので変わらないかと思っていたよ。
長さ指定で生成すると、その範囲内に高速アクセスするメモリが確保されるってことかなあ。
実装次第だろうけど。
64 = :
まあ、色んな配列やり方試して少しでもパフォーマンス上げるのはいいけど、
ブラウザによっても違うだろうし、それほど変わらないから、
それだったら jQuery 使わないやり方を覚えた方が速さを実感できる。
66 = :
>>65
1文字目だけ見れば残りは見なくても判断できるのだったら、1文字目
だけ取り出して大小比較でもいいかも。でも正規表現の方が結局素直な
気もする。
72 = :
グローバル変数は名前解決に時間がかかるからその分遅くなるしな
73 :
ほー
やっぱり、スコープチェーンを1個ずつ辿っていくから遅いんですかね?
74 = :
>>69
塗装か被覆みたいじゃないか。
75 = :
よく気づいたな。バグ取り得意なほうか?
76 = :
計ってみました。「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環境やブラウザによってぜんぜん違うんだからそれを書かなきゃ意味がない
79 = :
今時ページなんか作らないでconsoleでやれよ。それと、こんなもん繰り返しの数でその差は
開くんだし、そもそも参照じゃなくてインクリメント主体じゃねえか。そんな調査で
何倍だとか言われてもな。まあ、ブラウザによって実装は異なるんだしバージョンが上がれば
最適化で結果も変わるだろうし、決定的な差が無い限りこの手の調査は無意味だな。全くの無駄。
80 = :
何も計らないよりはましでしょ。参照がよければ参照に直して計れば
いいんだし。計ってみましたが。
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
つまり参照だけにしたら「ほとんど差はない」という結果になりました。
81 = :
参照なら x; y; だけでいいんだよ。でもこんなものは最適化で削ってしまうブラウザもあるかもしれんし、
毛曲は誤差の範囲なんだから実測値に意味は無い。というか、そのコードでも焦点は基本型のコピーだと思うがね。
こういうケースではよくあるだろ?論理的にはAのほうが速いとかいうやつ。それでいいんだよ。実測値を
持ってきたところで実装に依存する部分が多いし(参照なんて頻繁に最適化の対象にされるから)、
ECMAの仕様に純粋に依るなら 論理的には というワードを用いるしか無い。
82 = :
それと補足しておくと、ローカルとグルーバル、変数名の解決を実測したいなら
もっと変数を増やすとか、チェーンを連ねるとか、もう少し環境を考えるべきだぞ。そのコードだと
ローカル側は数えるほどしか変数がないじゃないか。
83 = :
最適化で削られているかどうかは、次のようなコードで試せば
分かるわけで。同環境で確かに時間は増えていますね。
<!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レベルの
呼び出しの中で計測していますが、値はほとんど変わらんようですね。
チェーンを重ねるというのは何をしろというご指摘なのか伺わせて
いただけますか。
84 = :
まだ計測するかw維持になってるのか!?あなたのいうレベルごとの呼び出しも
まったく意味のないことだよ。値がなぜ変わらないのか、それはスコープチェーンが一緒だからだよ。
変数名の解決とかで調べたらいいんじゃね。今回のテストは目的といい存在価値といい、悪いけど無駄だよ。
85 = :
入れ子スコープの変数を作ると違うのかと思いやってみました。
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();
87 = :
ましにはなったけど、残念ながらJSのスコープは関数単位だぞ。IFを関数に置き換えればいい。
その関数を何十にも重ねてやればそれだけチェーンが増えるということ。二重程度じゃテスト環境
としては不十分だな。それと変数名は eval を使って動的に大量に作らせたらいい。手動だと
読みにくいし書きにくいし最悪だぞ。
88 = :
アドバイスありがとうございます、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>
と記述すると
red[i].id===nameが正常に動かなくなりました。
formが2つ同じページあると挙動がおかしいのでしょうか?
90 = :
いちいち自前でテスト作らなくても、jsperfから探してきて、
そこで計測したほうがよっぽどましなテストが出来るよ
グローバルとローカル変数の違いだったら例えば以下とか。
http://jsperf.com/global-versus-local
91 = :
どっちも同じ結果になるのは、自分が書いた内容を理解していれば明らか。
なんたって、時間を計測して表示するのは test100 だけなんだから、
どっちも test100() の単一呼び出しの結果の数値だからなwww
92 = :
ああ、ようやく理解しました。つまり、ある関数(クロージャ)内から
外側環境の変数をアクセスしろっていうこと? でもそうすると、今の
ローカル変数より遅くなるだろうから、「グローバル変数の方が速い」
という結論になりそうじゃないですか?
93 = :
やってみました。やっぱ 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);
}
95 = :
jQueryUIのDialogを使って変な事象に出くわしました。
<body>
96 = :
jQueryUIのDialogを使って変な事象に出くわしました。
formの中のdivをDialog機能で表示しようとしたのですが、
form部分の下にしか表示されません。
例では省略してますが、実際かなりform部分は記載が多く、
全然想定したところ(真ん中)に出てくれず縦長なformの下に出てしまいます。
formの中に出したいのですが、
ネットで調べてもjQueryUIのダイアログがformの下に出るという事象は見つけましたが、
これと言った解決策は見つけきれてません。
何か対応策ありますでしょうか、それとも別のプラグイン使うかな…。
※>>95は自分です。書いてる途中でボタン押しちゃいました。すいません。
<html>
<head>
<script>
$(function(){
$("dialogtest").dialog();
});
</script>
</head>
<body>
<form action="AA">
略
<div id="dialogtest">TESTDIALOG</div>
略
</form>
</body>
</html>
97 = :
>>96の追加
環境はWindows7のIE8です。
IE7でも同じです。FireFoxはまだ試してませんが。
ただIEで動かないと仕事先の事情でどうしようもないのです。
連投すいません。以上、よろしくお願いします。
99 = :
>>96
やまかんだけど、 <form>...</form>のすぐ外側を<div>...</div>で囲んでみるとか?
100 = :
>>98>>99
ありがとうございます。これから会社行くんで試してみます。
会社で2ちゃん使えないので結果報告が今日夜になっちゃいますけど。
他にも何か思い当たる節がありましたら皆さんよろしくお願いします。
類似してるかもしれないスレッド
- + JavaScript の質問用スレッド vol.109 + (1001) - [97%] - 2013/10/7 13:16
- + JavaScript の質問用スレッド vol.144 + (288) - [97%] - 2020/5/17 20:00
- + JavaScript の質問用スレッド vol.100 + (1001) - [97%] - 2012/6/13 22:46
- + JavaScript の質問用スレッド vol.101 + (1001) - [97%] - 2012/7/16 14:15
- + JavaScript の質問用スレッド vol.102 + (1001) - [97%] - 2012/9/11 17:30
- + JavaScript の質問用スレッド vol.103 + (1001) - [97%] - 2012/11/9 15:30
- + JavaScript の質問用スレッド vol.105 + (1001) - [97%] - 2013/5/20 4:45
- + JavaScript の質問用スレッド vol.106 + (1001) - [97%] - 2013/7/20 9:30
- + JavaScript の質問用スレッド vol.107 + (1001) - [97%] - 2013/9/7 10:16
- + JavaScript の質問用スレッド vol.108 + (1001) - [97%] - 2013/9/21 15:16
- + JavaScript の質問用スレッド vol.134 + (1001) - [97%] - 2018/8/3 23:15
- + JavaScript の質問用スレッド vol.124 + (1001) - [97%] - 2015/7/16 1:30
- + JavaScript の質問用スレッド vol.114 + (1001) - [97%] - 2014/5/3 10:45
- + JavaScript の質問用スレッド vol.122 + (116) - [95%] - 2018/5/2 18:30
- + JavaScript の質問用スレッド vol.121 + (1001) - [95%] - 2015/1/1 18:30
- + JavaScript の質問用スレッド vol.122 + (1004) - [95%] - 2015/2/14 4:45
- + JavaScript の質問用スレッド vol.141 + (881) - [95%] - 2021/4/19 9:00
トップメニューへ / →のくす牧場書庫について