Я заметил странную технику в JavaScript, которую я использовал для увеличения производительности в повторяющихся процессах, которые рисуют на холсте. В будущем я планирую использовать SharedBufffer
или даже SharedCanvas
, когда они становятся реализованы, но в то же время, это общая идея, что я использую:Как повысить производительность асинхронного планировщика?
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>
Если вы запутались вокруг с параметрами вы обнаружите, что, конечно, delay
и intervals
оба существенно влияют на производительность. Но до некоторой степени, если вы установите слишком много intervals
за определенную задержку, усиление производительности превратится в падение производительности, а также приведет к тому, что поток не отвечает.
Мой вопрос: можно ли адаптировать intervals
и delay
на основе заданного someExpensiveFunction
? Предположим, что мы можем вернуть someExpensiveFunction()
метку времени высокого разрешения, performance.now()
, как мы можем использовать ее для изменения intervals
и delay
интеллектуально для оптимизации производительности?
Вы хотели бы использовать SetTimeout вместо setInterval, так что длительность интервала может изменяться с течением времени. Кроме того, правильное использование setTimeout не позволяет вам выполнять много операций одновременно. (Если ваша логика в setInterval превышает интервал, у вас возникнут проблемы.) –
@ChristopherDavies Я могу переписать планировщик, чтобы использовать 'setTimeout', если вы предпочитаете, но это на самом деле не отвечает на мой главный вопрос о том, как программно найти оптимальные значения. Кроме того, если логика в 'setInterval' превышает интервал, если вы делаете это внимательно, это то, что я нахожу, повышает производительность. Я предполагаю, что механизм JavaScript как-то подсказывает, что процессор разгоняется или что-то в этих условиях, но по мере того, как я пытался намекать, конкретные значения будут отличаться между различными компьютерами и браузерами. –
Вот довольно хорошая ссылка на то, почему вы должны использовать setTimeout: https://zetafleet.com/blog/2010/04/why-i-consider-setinterval-to-be-harmful.html Что касается вашего основного вопроса, Опубликуйте комментарий. –