Какое минимальное значение в миллисекундах для setTimeout? - PullRequest
43 голосов
/ 10 марта 2012

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

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

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

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

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

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

Каким будет минимальное значение setTimeout для

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

Ответы [ 4 ]

43 голосов
/ 10 марта 2012

Я думаю, что 10 будет самым надежным минимумом во всех браузерах, так как я видел много кодов, использующих его.

Тем не менее, 4ms является минимумом для HTML5

На самом деле, 4ms задается спецификацией HTML5 и является одинаковой для всех браузеров, выпущенных в 2010 году и далее.До (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2) минимальное значение тайм-аута для вложенных тайм-аутов составляло 10 мс.

9 голосов
/ 10 марта 2012

Минимум составляет 4 мс (по состоянию на HTML5) в современном браузере, до этого он был 10 мс. Обратите внимание, что это время никогда не бывает точным на 100%.

3 голосов
/ 25 ноября 2014

setTimeout наиболее вероятно вызывает системный вызов sleep или Sleep .

Фактическая механика, включая минимальное количество миллисекунд, равное setTimeout, является проприетарной и / или системно-зависимой, поскольку они не включены в официальные спецификации ECMA.Это зависит от вашего времени выполнения Javascript, а также от системы, в которой вы его используете.Учитывая, что ваше время выполнения Javascript не добавляет много накладных расходов, минимальное количество миллисекунд определяется разрешением временного интервала вашей операционной системы и оборудования.Наименьшее «спящее» время - это обычно время, необходимое для того, чтобы процесс был выделен еще временным интервалом алгоритмом планирования вашей системы .

в Windows (postXP) например, документация для системного вызова сна раскрывает:

Нулевое значение заставляет поток отказаться от оставшейся части его временного интервала для любого другого потока, который являетсяготов к запуску.Если нет других потоков, готовых к запуску, функция немедленно возвращается, и поток продолжает выполнение.

Это означает, что в некоторых крайне редких условиях, когда нет другого процесса, ожидающего в данный момент аппаратный поток , на котором запущен ваш Javascript-процесс -процесс , он может продолжаться сразу после завершения работы вызывающей стороны, в зависимости от того, как реализован ваш Javascript-код.Вы, вероятно, не будете соблюдать такое условие очень часто, хотя:)

3 голосов
/ 10 марта 2012

В этой статье тестируются 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>
...