Como obter tempos de microssegundos em JavaScript desde Spectre e Meltdown

A situação

Ao escrever código JavaScript de alto desempenho, as ferramentas de perfil padrão oferecidas por Chrome et al nem sempre são suficientes. Eles apenas parecem oferecer granularidade no nível da função e pode demorar bastante para pesquisar e encontrar as informações necessárias.

No .NET, oStopWatch A classe fornece exatamente o que eu preciso: tempo de resolução de microssegundos de partes arbitrárias de código.

Para JavaScriptperformance.now() costumava ser uma boa maneira de medir o desempenho, mas em resposta ao Spectre e ao Meltdown, todos os principais navegadores reduziram a resolução para nem um milissegundo.

Para citar o MDN emperformance.now ():

O registro de data e hora não é de alta resolução. Para atenuar ameaças à segurança, como o Spectre, os navegadores atualmente arredondam o resultado em vários graus. (O Firefox começou a arredondar para 2 milissegundos no Firefox 59.) Alguns navegadores também podem randomizar levemente o carimbo de data e hora. A precisão pode melhorar novamente em versões futuras; os desenvolvedores de navegadores ainda estão investigando esses ataques de tempo e a melhor forma de mitigá-los.

O problema

Preciso de intervalos de precisão de microssegundos. No momento da redação deste artigo, os navegadores não parecem oferecer opções ou sinalizadores para desativar essas medidas de segurança. Talvez eu esteja pesquisando no Google os termos errados, mas os únicos artigos que encontro são explicações sobre os problemas de segurança e como essas atenuações os solucionam.

Não estou interessado no aspecto de segurança aqui - estou comparando peças de código JavaScript com desempenho crítico em minha própria máquina e a única coisa com a qual me preocupo é que obtenho medições o mais precisas possível com o mínimo de esforço possível.

Soluções alternativas existentes

Duas opções vêm à mente:

Instale uma versão mais antiga de um navegador que não possui essas atenuações implementadas

Eu precisaria dedicar uma versão antiga do FireFox ao benchmarking e uma nova versão do Chrome à navegação, por exemplo. Isso não é prático, pois preciso testar em todos os navegadores (e de preferência também em benchmarks em todos os navegadores). Além disso, novas otimizações não são implementadas em navegadores antigos, portanto os benchmarks seriam potencialmente inúteis.

Implementar um cronômetro personalizado usando WebWorkers

Eu já vi vários posts antigos sobre isso, mas nenhum deles parece alcançar a alta precisão que eu preciso (afinal, costumava haverperformance.now() por isso).

A questão

Como obtenho um pré-espectro eficazperformance.now() sem ter que recorrer a versões mais antigas do navegador, máquinas virtuais e tal?

Existem técnicas de codificação ou bibliotecas em JavaScript que atingem precisão de microssegundos?

Existem opções ou sinalizadores para os 3 navegadores mencionados acima que desabilitam essas medidas de segurança?

No final das contas, estou procurando uma maneira de medir com precisão o desempenho relativo de diferentes partes do código em comparação - se houver uma solução que me dê tiques, em vez de microssegundos, isso seria aceitável desde que sejapreciso e funciona em navegadores.

questionAnswers(1)

yourAnswerToTheQuestion