Что такое минимальная миллисекунда значения setTimeout?
Я хотел бы поставить
var minValue = 0;
if ( typeof callback == 'function' ) {
setTimeout( callback, minValue );
}
этот код, когда я реализую функцию обратного вызова с помощью JavaScript.
Но я обнаружил, что современные браузеры и некоторые старые браузеры
имеют различное минимальное значение таймаута.
Я знаю, что Zero не может быть минимальным значением.
Что было бы минимальным значением setTimeout для
современные браузеры и некоторые старые браузеры для проблем совместимости?
Ответы
Ответ 1
Я думаю, что 10 будут самым надежным минимумом во всем браузере, так как я видел много кодов, использующих его.
Однако 4ms является минимальным для HTML5
Фактически, 4ms указывается спецификацией HTML5 и согласован между браузерами, выпущенными в 2010 году и далее. До (Firefox 5.0/Thunderbird 5.0/SeaMonkey 2.2) минимальное значение таймаута для вложенных тайм-аутов составляло 10 мс.
Ответ 2
В современном браузере минимум 4 мс (с HTML5), до этого - 10 мс. Обратите внимание, что эти времена никогда не на 100% точны.
Ответ 3
В этой статье анализируются графики производительности 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>
// number of times to call setTimeout before calculating average
var ITERATIONS = 200;
window.onload = function()
{
testTimeout(10, +new Date, 0, 0);
}
// calls setTimeout repeatedly at a specified interval, tracking the amount
// of time that passes between successive calls
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>
Ответ 4
setTimeout
, скорее всего, вызывает вызов sleep
или Sleep
.
Фактическая механика, включая минимальное количество миллисекунд, setTimeout
является запатентованной и/или зависящей от системы, поскольку они не входят в официальные спецификации ECMA. Это зависит от времени выполнения Javascript, а также от системы, в которой вы ее запускаете. Учитывая, что во время выполнения Javascript не добавляется много накладных расходов, минимальное количество миллисекунд определяется временным разрешением вашей операционной системы и оборудования. Наименьшее "спящее" количество времени - это обычно время, необходимое для того, чтобы процесс был назначен другим временным слоем с помощью вашего алгоритма планирования системы.
Например, в Windows (post XP) документация для системного вызова сна показывает:
Значение нуля заставляет поток отбрасывать оставшуюся часть своего временного фрагмента на любой другой поток, который готов к запуску. Если нет других потоков, готовых к запуску, функция немедленно возвращается, и поток продолжает выполнение.
Это означает, что в некоторых чрезвычайно редких условиях, когда в аппаратном потоке, на котором выполняется ваш Javascript- процесс, нет другого процесса, который ожидает текущий процесс выполнения Javascript, он может продолжаться сразу же после завершения выполнения вызывающего абонента в зависимости от того, как выполняется время выполнения Javascript. Вы, вероятно, не будете наблюдать такое состояние очень часто, хотя :)