少しでもforの負荷を軽減したいと思い、
1のコード 1回で10000回ループ処理させるもの
2のコード 1回で10000回とせず、10回づつ小分けにしてforでループ処理→10000回まで繰り返す処理を考えましたが、
小分けにした場合と1度の場合では負荷と速度の大きな差は出ないのでしょうか?
差を出せないのであれば、それはなぜですか
理屈がわかりません
1 <script> function a(){ for(i=0;i<=10000;i++){ console.log(i); } } a(); </script>
2 <script> function a(){ max_num=10000; n2=10; n=0; while(n2<=max_num){ for(i=n;i<=n2;i++){ console.log(i); } n=n+10; n2=n+10; } } a(); </script>
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
計測
小分けにした場合と1度の場合では負荷と速度の大きな差は出ないのでしょうか?
実際に計測して下さい。
環境の違いで速度は変わるものなので、自分の環境で計測するのが最も確実です。
JavaScript
1function a1() { 2 for (var i = 0; i <= 10000; i++) { 3 console.log(i); 4 } 5} 6 7function a2() { 8 var max_num = 10000; 9 var n2 = 10; 10 var n = 0; 11 while (n2 <= max_num) { 12 for (var i = n; i <= n2; i++) { 13 console.log(i); 14 } 15 n = n + 10; 16 n2 = n + 10; 17 } 18} 19 20console.time('a1'); 21a1(); 22console.timeEnd('a1'); 23 24console.time('a2'); 25a2(); 26console.timeEnd('a2');
結果
a1: 659.2548828125 ms a2: 682.5908203125 ms
a1が速いのは、a2よりも処理が少ないからです。
a2は10000回ループさせる為にwhile文を実行し、新しい変数を定義しています。
有意な速度差
有意な速度差を見出すには、ボトルネックとなる処理の実行回数を減らすことです。
JavaScript
1function a3() { 2 for (var i = 0, array = []; i < 10001; i++) { 3 array.push(i); 4 } 5 6 console.log(array.join('\n')); 7} 8 9console.time('a3'); 10a3(); 11console.timeEnd('a3');
結果
a3: 5.558837890625 ms
console.log()
を実行すると、コンソールに文字列が出力される為、画面の再描画が発生します。
console.log()
の実行回数を1回にすれば、再描画は1回で済みます。
同じ理屈で下記2つのパターンで実行時間を計測した場合も差が生まれます。
- コンソールを開いた状態でページを開く
- コンソールを閉じた状態でページを開く
本回答では有意な差を出す為に、コンソールを開いた状態で console.time()
を実行しています。
グローバル変数
高速化を狙う場合、グローバル変数は可能な限り、避けるべきです。
スコープチェーンの関係上、グローバル変数はローカル変数よりも遅いからです。
ご質問のコードはグローバル変数を使用していますが、本回答のコードではローカル変数に修正しています。
Re: valvalx さん
投稿2022/07/06 14:57
総合スコア18164
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
単純ループの話なら、分割しようがしまいが変わらないでしょうね。
膨大な配列データを処理するとかでなく、単なる数値データの足し算程度なら。
メモリやリソースをどう使うかによっては、分割の仕方で影響が出てくるかと。
足し算じゃなくて、例えば1万文字を1万回連結するとかメモリを使うよね。
DOM生成もwebブラウザのリソースを使う処理だし。
前の質問でDOM生成の話を踏まえますが、
DOM生成する→レンダリングされる、
の一連の処理で、
1件ずつDOM生成を指示するのと、
一度に1万件溜め込んで一度にDOM生成させるのと、
10件や20件ずつ区切って繰り返すのとで、
DOM生成→レンダリングのタイミング次第でバランスを取る必要があるということなんじゃないかと。
(統計データを取ってないので、曖昧な言い方になってしまいますが。)
ついでに、
もしかして簡単にページ遷移してしまうようなページで
1万件もDOM生成するとかやってたりしませんか?
それは無駄な処理をしていると思います。
そこはしっかりページネーションして、
必要な情報量で見せるように改善したら良いかと。
投稿2022/07/06 00:18
編集2022/07/06 00:36退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
※ご指摘いただき、ループ回数の間違いを調整しました
以下実験
- シングルループ let
- シングルループ var
- 多重ループ let
- 多重ループ var
(速い) 1 > 2 > 3 > 4 (遅い)
javascript
1const t=new Date().getTime(); 2for(let i=0;i<=10**9;i++){ 3void(0); 4} 5console.log(new Date().getTime()-t);
javascript
1const t=new Date().getTime(); 2for(var i=0;i<=10**9;i++){ 3void(0); 4} 5console.log(new Date().getTime()-t);
javascript
1const t=new Date().getTime(); 2for(let i1=0;i1<10;i1++){ 3for(let i2=0;i2<10;i2++){ 4for(let i3=0;i3<10;i3++){ 5for(let i4=0;i4<10;i4++){ 6for(let i5=0;i5<10;i5++){ 7for(let i6=0;i6<10;i6++){ 8for(let i7=0;i7<10;i7++){ 9for(let i8=0;i8<10;i8++){ 10for(let i9=0;i9<10;i9++){ 11void(0); 12} 13} 14} 15} 16} 17} 18} 19} 20} 21console.log(new Date().getTime()-t);
javascript
1const t=new Date().getTime(); 2for(var i1=0;i1<10;i1++){ 3for(var i2=0;i2<10;i2++){ 4for(var i3=0;i3<10;i3++){ 5for(var i4=0;i4<10;i4++){ 6for(var i5=0;i5<10;i5++){ 7for(var i6=0;i6<10;i6++){ 8for(var i7=0;i7<10;i7++){ 9for(var i8=0;i8<10;i8++){ 10for(var i9=0;i9<10;i9++){ 11void(0); 12} 13} 14} 15} 16} 17} 18} 19} 20} 21console.log(new Date().getTime()-t);
投稿2022/07/06 00:50
編集2022/07/06 01:01総合スコア114843
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。