質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

5回答

689閲覧

for 小分け 意味がない

valvalx

総合スコア22

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2022/07/05 17:07

少しでも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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/07/05 23:19 編集

> 差を出せないのであれば、それはなぜですか 逆に、どのような差が出ると思っていますか? またその差が出る理由はどういうものと考えていますか? まず「負荷」という言葉が具体的に何を指しているかの説明から始め、以上三点について質問に追記してください。
guest

回答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

think49

総合スコア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

差を出せないのであれば、それはなぜですか
理屈がわかりません

1秒かかる仕事を1万回ループさせれば1万秒かかりますよね

その仕事を10回ループさせると何秒でしょうか。
そして、その10回ループを千回繰り返したら何秒になるでしょう。

#小学校の宿題かなんか?

投稿2022/07/05 22:25

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

※ご指摘いただき、ループ回数の間違いを調整しました

以下実験

  1. シングルループ let
  2. シングルループ var
  3. 多重ループ let
  4. 多重ループ 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
yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/07/06 00:57 編集

0~10の11回やってるように見えなくもない。「<=」じゃなく「<」ではないかと。
yambejp

2022/07/06 01:01 編集

ありゃ・・・ホントだ 失礼しました、修正しました。
guest

0

結局最終的に10000回ループしたのでは意味がありません。
1回のループで複数回分まとめて処理が可能でループ回数を減らせるのであれば意味がありますが、
単純に小分けだけしてもむしろ小分けにするため余計なことをしている分遅くなるだけです。

投稿2022/07/05 17:15

RiaFeed

総合スコア2701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問