私は、キャンバスにペイントする反復プロセスでパフォーマンスを向上させるために使用した、JavaScriptの奇妙なテクニックに気付きました。非同期スケジューラのパフォーマンスを最大化する方法は?
function someContinuousProcess(intervals, delay) {
var count = 0;
var span = document.querySelector('span');
function someExpensiveFunction() {
if (count >= 1e9) {
return false;
}
do {
count++;
} while (count % 1e5);
span.textContent = count;
return true;
}
function wrapper(index) {
var start = performance.now();
if (someExpensiveFunction()) {
var delta = performance.now() - start;
// some logic here to determine new
// values for `intervals` and `delay`
scheduler[index] = setTimeout(
wrapper.bind(null, index),
delay
);
}
}
var scheduler = [];
function startScheduler() {
for (var i = 0; i < intervals; i++) {
scheduler[i] = setTimeout(
wrapper.bind(null, i),
delay
);
}
}
function stopScheduler() {
for (var i = 0; i < scheduler.length; i++) {
clearTimeout(scheduler[i]);
}
scheduler = [];
}
startScheduler();
}
int.onchange = del.onchange =() => {
var intervals = parseInt(int.value);
var delay = parseInt(del.value);
if (!isNaN(intervals) && !isNaN(delay)) {
someContinuousProcess(intervals, delay);
}
};
<input placeholder=intervals id=int>
<input placeholder=delay id=del>
<span></span>
あなた混乱した場合:将来的には、私は彼らが実装されますが、その間に、これは私が使用して何のための一般的な考え方であるとなっSharedBufffer
あるいはSharedCanvas
を使用する予定パラメータの周りには、もちろんdelay
とintervals
の両方がパフォーマンスに大きな違いをもたらすことがわかります。しかし、ある一定の遅延に対してあまりにも多くのintervals
を設定すると、パフォーマンスの低下がパフォーマンス低下に変わり、スレッドが応答しなくなります。
私の質問は、someExpensiveFunction
に基づいてintervals
とdelay
を適応的に選択できますか? someExpensiveFunction()
は、高解像度のタイムスタンプ、performance.now()
を返すことができると仮定しましょう。どのようにしてintervals
とdelay
を最適化してパフォーマンスを最適化できますか?
あなたは間隔の期間は、時間の経過とともに変化することができるように、のsetIntervalの代わりにsetTimeoutを使用したいと思います。また、setTimeoutを適切に使用すると、一度に多くの操作を積み重ねることができなくなります。 (setIntervalのロジックがインターバルを超えていれば、あなたは困っているでしょう) –
@ChristopherDaviesもしあなたが望むなら、 'setTimeout'を使うようにスケジューラを書き直すことはできますが、それは本当に私の主な質問に答えません最適な値をプログラムで指定します。また、 'setInterval'のロジックがインターバルを超えた場合、慎重に行うと、パフォーマンスが向上します。私の推測では、JavaScriptエンジンはCPUに何らかの理由でCPUにオーバークロックなどを促しているが、ヒントとして試してみると、さまざまなコンピュータとブラウザで特定の値が異なることになる。 –
ここにsetTimeoutを使うべき理由があります:https://zetafleet.com/blog/2010/04/why-i-consider-setinterval-to-be-harmful.htmlあなたの主要な質問については、フォローアップのコメントを投稿します。 –