Подтвердить что ты не робот

Что такое минимальная миллисекунда значения setTimeout?

Я хотел бы поставить

var minValue = 0;
if ( typeof callback == 'function' ) {
    setTimeout( callback, minValue );
}

этот код, когда я реализую функцию обратного вызова с помощью JavaScript.

Но я обнаружил, что современные браузеры и некоторые старые браузеры

имеют различное минимальное значение таймаута.

Я знаю, что Zero не может быть минимальным значением.

Что было бы минимальным значением setTimeout для

современные браузеры и некоторые старые браузеры для проблем совместимости?

4b9b3361

Ответ 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. Вы, вероятно, не будете наблюдать такое состояние очень часто, хотя :)