Qual é o valor mínimo de milissegundos de setTimeout?

Eu gostaria de colocar

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

este código quando eu implementar a function de retorno de chamada com JavaScript.

Mas descobri que navegadores modernos e alguns navegadores antigos

tem um valor de tempo limite mínimo diferente.

Eu sei que Zero não pode ser um valor mínimo.

Qual seria o valor mínimo de setTimeout para

navegadores modernos e alguns navegadores antigos para problemas de compatibilidade?

Eu acho que 10 será o mínimo mais confiável em todos os navegadores, já que eu vi muitos códigos usando ele.

No entanto, 4ms é o mínimo para HTML5

Na verdade, 4ms são especificados pela especificação HTML5 e são consistentes em todos os navegadores lançados em 2010 e em diante. Antes (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2), o valor mínimo de tempo limite para timeouts nesteds era de 10 ms.

O mínimo é de 4ms (como no HTML5) no navegador moderno, antes disso, eram 10ms. Observe que esses horários nunca são 100% precisos.

Este artigo testa o Firefox, o Safari e o Opera e plota charts de desempenho:

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

Firefox 2, Opera e Safari todos têm uma janela inferior de 10ms para atrasos

Para navegadores mais antigos, você pode fazer um teste como o daquele artigo. Acabei de executar um teste que tive de um tempo atrás de setInterval usando um intervalo de 10ms no IE6 e obtive uma média de 55ms . setTimeout parece ser menor a 35ms .

Fiz o teste no Chromium e obtive uma média de aproximadamente 11 ms por um tempo limite de 10 ms. Eu tentei com intervalos de 4ms e 1ms e consegui ~ 4.5ms para ambos. Além disso, lembre-se de que os números podem variar entre os sistemas operacionais.

Se você estiver interessado, aqui está o código de teste:

  

setTimeout provavelmente está chamando a chamada do sistema Sleep ou Sleep .

A mecânica real, incluindo a quantidade mínima de milissegundos, de setTimeout é proprietária e / ou dependente do sistema, uma vez que não estão nas especificações oficiais do ECMA. Depende do seu tempo de execução em Javascript, bem como do sistema em que você está executando. Dado que o tempo de execução do Javascript não adiciona muita sobrecarga, a quantidade mínima de milissegundos é determinada pela resolução do timeslice do seu sistema operacional e hardware. O menor período de tempo “habitável” geralmente é o tempo que leva para o processo ser alocado em outro timeslice pelo algoritmo de agendamento do seu sistema.

No Windows (pós XP), por exemplo, a documentação da chamada do sistema sleep revela:

Um valor zero faz com que o encadeamento abandone o restante de sua fatia de tempo para qualquer outro encadeamento pronto para ser executado. Se não houver outros encadeamentos prontos para execução, a function retornará imediatamente e o encadeamento continuará a execução.

Isso significa que, em algumas condições extremamente raras, onde não há outro processo atualmente aguardando o thread de hardware no qual o processo de tempo de execução do JavaScript está sendo executado, ele pode continuar imediatamente, dependendo de como o tempo de execução do Javascript é implementado. Você provavelmente não irá observar essa condição com muita frequência embora 🙂