Рассмотрим приложение, которое периодически выполняет фоновую задачу через setTimeout
/ setInterval
. Какой идеальный объем работы должен выполнять один вызов функции?
Пример:
myTask = function() {
for (var i=0; i<chunkSize; i++) { ...work... }
}
setInterval(myTask, period);
Если вы увеличите chunkSize
(и сделаете больше итераций на вызов), конечно, он будет работать дольше. Это означает, что period
также придется увеличить, и вы можете вызывать функцию реже. Но я обнаружил, что, тем не менее, чем больше куски, тем больше работы. Вероятно, это связано с накладными расходами setTimeout
/ setInterval
Компромисс: большие блоки делают приложение менее реактивным. Это касается не только взаимодействия с пользователем, но и других интервалов. Поскольку, пока функция выполняет свои итерации, никакой другой интервал не может быть запущен. Таким образом, большие размеры чанка делают другие интервалы менее точными или (в худшем случае) полностью отключают их в некоторых браузерах, чтобы они больше не вызывались.
Если вы хотите
- максимизировать объем выполняемой работы
- свести к минимуму плохое влияние на другие интервалы и сохранить их точность
каков наилучший способ достичь этого? Как вы определяете хороший размер куска? Или я должен отслеживать время выполнения в цикле и прерывать через определенное время? Или что-то еще?
(кстати, речь идет о простом старом JavaScript, а не HTML5 WebWorkers)