2012-03-10 2 views
40

Я хотел бы поставитьЧто такое минимальная миллисекунда значения setTimeout?

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

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

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

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

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

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

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

+6

[См. MDN.] (Https://developer.mozilla.org/en/DOM/window.setTimeout#Minimum_delay_and_timeout_nesting). Хотя каждый раз, когда вы укажете, никогда не бывает надежным. – pimvdb

+1

Вы всегда можете написать тест ... –

+0

@BradChristie Как вы используете JavaScript-код UnitTest? TDD? – InspiredJW

ответ

39

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

Однако 4ms is the minimum for HTML5

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

+0

Прошу прощения, это не правда? Я просто не могу найти утверждение о задержке 4 мс в [стандарте] (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timers), за исключением примечания: «Примечание: таймеры могут быть вложенными, но после пяти таких вложенных таймеров интервал должен быть не менее четырех миллисекунд». Дальнейшее любопытство привело меня к [этому замечательному сообщению] (https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/Hn3GxRLXmR0/XP9xcY_gBPQJ) в группах google о том, как они это делают Хром. –

+0

@TobbeBrolin Является ли это истинным в реализации, [он все еще находится в спецификации] (http://www.w3.org/TR/html5/webappapis.html#timers): «Если выполняемая в настоящее время задача - это задача, которая была созданный методом setTimeout(), а тайм-аут меньше 4, затем увеличивайте тайм-аут до 4. " – apsillers

+2

@TobbeBrolin Тем не менее, я не вижу, что langauge отражается в спецификации WHATWG. Похоже, W3C и WHATWG не согласны с этим. – apsillers

9

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

3

В статье тесты Firefox, Safari и Opera и сюжеты производительности графики:

http://ejohn.org/blog/analyzing-timer-performance/

Firefox 2, Opera и Safari все имеют нижнее окно 10мс для задержки

Для старых браузеров вы можете сделать тест, подобный тому, который указан в этой статье. Я только что проверил тест, который у меня был с setInterval, используя интервал 10 мс в IE6, и я получил среднее значение 55ms. setTimeout кажется ниже на 35ms.

Я проверил тест в Chromium и получил ~ 11ms среднее значение для тайм-аута 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> 
3

setTimeout, скорее всего, называя sleep or Sleep system call.

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

В Windows (после XP), например, the documentation for the sleep system call показывает:

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

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

+1

Настоящий истинный ответ – Pinal

+4

Я должен признать, что этот ответ не убеждает меня, поскольку он не соответствует тому, что, как мне кажется, я знаю о javascirpt (в основном) однопоточном исполнении на основе событий. Не могли бы вы указать на любую ссылку, говорящую, что любая реализация js вызывает 'sleep'? – Davide

+0

* «он может продолжаться немедленно, в зависимости от того, как реализована ваша работа Javascript». * Если среда выполнения реализована правильно, тайм-аут не будет выполняться до тех пор, пока текущий код не завершит выполнение, даже если вы укажете время 0 все равно будет стоять в очереди. – nnnnnn

Смежные вопросы