Какое минимальное значение в миллисекунд для setTimeout?
Я хочу использовать следующий код:
var minValue = 0;
if ( typeof callback == 'function' ) {
setTimeout( callback, minValue );
}
при реализации функции обратного вызова в JavaScript.
Однако я столкнулся с проблемой: современные браузеры и некоторые старые браузеры имеют разные минимальные значения для таймаута.
Я знаю, что ноль не может быть минимальным значением.
Какое минимальное значение для setTimeout следует использовать для обеспечения совместимости с современными и старыми браузерами?
2 ответ(ов)
Минимальное время составляет 4 мс (по состоянию на HTML5) в современных браузерах; ранее оно составляло 10 мс. Обратите внимание, что эти цифры никогда не бывают на 100% точными.
В этой статье тестируются Firefox, Safari и Opera, а также строятся графики производительности:
http://ejohn.org/blog/analyzing-timer-performance/
Firefox 2, Opera и Safari имеют минимальное значение задержки в 10 мс.
Для старых браузеров вы можете провести тест, подобный тому, что описан в статье. Я только что выполнил тест, который у меня был ранее, используя setInterval
с интервалом 10 мс в IE6, и получил среднее значение 55 мс. setTimeout
, похоже, работает быстрее, со средним значением 35 мс.
Я провел тест в Chromium и получил среднее значение ~11 мс для тайм-аута 10 мс. Я попробовал с интервалами 4 мс и 1 мс и получил ~4.5 мс для обоих. Также имейте в виду, что результаты могут варьироваться между операционными системами.
Если вам интересно, вот код для теста:
<script>
// количество вызовов setTimeout перед расчетом среднего
var ITERATIONS = 200;
window.onload = function()
{
testTimeout(10, +new Date, 0, 0);
}
// вызывает setTimeout повторно с указанным интервалом, отслеживая время,
// прошедшее между последовательными вызовами
function testTimeout(interval, last, sum, ii)
{
var time = +new Date;
var difference = time - last;
sum += difference;
if (ii % ITERATIONS == 1)
{
document.body.innerHTML = sum / ITERATIONS;
sum = 0;
}
window.setTimeout(
function() {
testTimeout(interval, time, sum, ii + 1)
}, interval);
}
</script>
Этот код позволит вам протестировать производительность таймеров в вашем браузере.
Какое наибольшее целочисленное значение в JavaScript, при котором не теряется точность?
Как проще всего вызывать функцию каждые 5 секунд в jQuery?
Сочетание асинхронной функции, await и setTimeout
Как узнать, нажата ли кнопка обновления или кнопка "Назад" в браузере Firefox?
Как создать PDF-файл из бинарной строки, полученной от веб-сервиса, с использованием JavaScript