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

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

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

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

Q&A

解決済

2回答

1067閲覧

JavaScript DOMに秒間で2万個のオブジェクトに更新を与え続ける

xcx

総合スコア15

JavaScript

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

0グッド

0クリップ

投稿2021/06/28 22:57

DOM上にdivを2万個生成

秒的に変化を与えるという処理を行っています
あとからDOMをいじるべきではないという意見も散見していましたが、
実際どうなんでしょうか
CSS Animationさえ掛けなければ、負荷としてはたいして問題ないと考えていいのか、
2万個は多すぎるが1万個だったら平気だとか、
詳しい知見をお持ちの方返答お願いいたしましす

このコードに意味はありません わざと負荷をかける作りで再現しています <script> window.onload=function(){ for(i=0;i<20000;i++){ div=document.createElement("div"); div.style.width="100%"; div.style.height="20px"; div.classList.add("div"); div.style.background="rgb("+(~~(256*Math.random()))+","+(~~(256*Math.random()))+","+(~~(256*Math.random()))+")"; document.body.appendChild(div); } timer(); } function timer(){ Array.from(document.querySelectorAll('.div'), div => { div.style.background="rgb("+(~~(256*Math.random()))+","+(~~(256*Math.random()))+","+(~~(256*Math.random()))+")"; }); Array.from(document.querySelectorAll('.div'), div => { div.innerHTML=Math.random(); }); setTimeout(timer,1000); } </script>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

maisumakun

2021/06/28 23:04 編集

「わざと負荷をかける作り」としているコードなのに「負荷としてはたいして問題ないと考えていい」とかそういう議論となるのは、どのような背景があってのことなのでしょうか?
xcx

2021/06/28 23:07

自分自身でも今どれほど負荷がかかってるのかわからない、 一般的な知見でどの程度だったら許容されるのかなど、知りたかったのですが
maisumakun

2021/06/28 23:09

「わざと負荷をかける」状況自体が全く「一般的」なものではないので、一般的な状況での知見を適用する範疇から外れていると感じました。
y_waiwai

2021/06/28 23:26

なにをやりたくてそれをやってるんでしょう。
xcx

2021/06/28 23:28

やりたいことはチャットのようなシステムを作り、 発言されたログの時刻を全てリアルタイムで更新し続けるためです ログが増えれば増えるほど更新箇所が増える為、どれだけ耐えうるのか知りたかったです
maisumakun

2021/06/28 23:46

> ログが増えれば増えるほど更新箇所が増える為 追加になった分だけ更新するのであれば、「秒間で2万個」なんていうことにはならないのではないでしょうか?
y_waiwai

2021/06/28 23:58

ならそんな回りくどいことせずに、実際にそれを作って負荷実験をすればいいんでは。
Lhankor_Mhy

2021/06/29 01:47

1秒間に1万件のチャット更新をするなら、描画よりもネットワークの方がボトルネックになりそうな気がしますね。
guest

回答2

0

当方の環境でご提示のコードを試してみましたが、500msほどで描画が完了しているので、問題は起きませんでしたが、GCはやや厳しそうでした。環境によっては問題が起きる数値かと思います。

なお、yambejpさんのコードのように、1万の要素ごとに毎秒ペイント処理が起きるような書き方をするとかなり厳しいと思います。
ペイント処理が1秒に1回になるように工夫すれば、まあ、なんとか、という感じではないでしょうか。

投稿2021/06/29 01:46

Lhankor_Mhy

総合スコア36960

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

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

0

ベストアンサー

普通にやれば実用には耐えないでしょうね

javascript

1<table border id="t1"></table> 2<script> 3const w=10; 4const h=10; 5const tr=Array(w).fill(null).map(()=>document.createElement('td')).reduce((x,y)=>(x.appendChild(y),x),document.createElement('tr')); 6Array(h).fill(null).forEach(()=>t1.appendChild(tr.cloneNode(true))); 7document.querySelectorAll("td").forEach(x=>{ 8 setInterval(()=>x.textContent=parseInt(Math.random()*10),1000); 9}); 10</script>

w=100、h=200あたりでテストするとブラウザによってメモリをバカ食いしたり
描画が追いつかなかったり、いろいろです

投稿2021/06/29 01:12

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問