javascript に setinterval 関数があり、できるだけ速くしたい、つまり 1 ミリ秒ごとにイベントのステータスをチェックします。これは、ユーザーのブラウザーに要求しすぎている可能性はありますか? うまく機能しているように見えますが、それが悪い習慣なのかどうか疑問に思っています。
6 に答える
それは可能であるだけでなく、非常に一般的です。それは本質的に競合状態です。次の間隔の前に実行されるコールバック内のコードに依存している場合は、setTimeout
代わりに再帰を使用してください。
また、間隔が呼び出されない限り、lockUpBrowser
コールバック間のその期間は、現実的なパフォーマンス処理には短すぎる可能性があります。
(function myRecursiveTask() {
// Do your task here
myTask();
if (!someConditionToAllowABailOut) {
setTimeout(myRecursiveTask, 100); // 100ms loop
}
}());
setInterval
指定された間隔で正確に実行される保証はありません。できるだけ早く実行されますが、javasript はシングルスレッドであり、この時点で他のコードが実行される可能性があるため、コールバックが遅れる可能性があります。
1msを使用setInterval
している場合は、問題を間違った方法で解決しようとしている可能性があります。
はい、渡された関数参照のsetInterval
実行に間隔よりも長い時間がかかる場合、関数の呼び出しはキューに入れられ、ブラウザーが停止します。アニメーションを実行しようとしていて、各ステップをできるだけ速く変更したい場合は、requestAnimationFrame
最新のブラウザーで使用する必要がある関数があります。個人的には、すべての関数よりも速く関数を実行する必要はありませんでした15ms
。
私は確かにそのようなアプローチの必要性を疑問視します. 10 ミリ秒ごと、100 ミリ秒ごと、または 1 秒ごとにチェックできないもので、1 ミリ秒ごとにチェックする必要があるものは何ですか?
複数のチェックプロセスがスタックして実行されないように、毎回実行するチェック機能が常に 1 ミリ秒未満で実行されることを 100% 確信していますか?
プロセスに必要なメモリと CPU の量は? また、ユーザーのブラウザーの速度を、スクロールなどの単純な操作が苦痛になるまで遅くする可能性はありますか?
while ループは遅すぎますか?
while (condition)
{
//code block to be executed
}
私はあなたの質問に答えていないことを知っていますが、そのようなことをするより良い方法はないと思います...