Ситуация
При написании высокопроизводительного кода JavaScript стандартные инструменты профилирования, предлагаемые Chrome et al, не всегда достаточны. Похоже, они предлагают только детализацию на уровне функций, и может потребоваться много времени для детализации и поиска необходимой мне информации.
В .NET класс StopWatch
дает мне именно то, что мне нужно: разрешение на субмикросекундном разрешении произвольных фрагментов кода.
Для JavaScript performance.now()
был довольно хорошим способом измерения производительности, но в ответ на Spectre и Meltdown все основные браузеры снизили разрешение даже до миллисекунды.
Чтобы цитировать MDN на performance.now () :
В действительности отметка времени не имеет высокого разрешения. Для смягчения безопасности
такие угрозы, как Spectre, браузеры в настоящее время округляют результат до
различные степени. (Firefox начал округлять до 2 миллисекунд в
Firefox 59.) Некоторые браузеры также могут слегка рандомизировать временную метку.
Точность может снова улучшиться в будущих выпусках; разработчики браузеров
все еще исследуют эти атаки времени и как лучше смягчить
им.
проблема
Мне нужно время с точностью до микросекунды. На момент написания статьи браузеры не предлагали никаких опций или флагов, чтобы отключить эти измерения безопасности. Возможно, я прибегаю к неверным терминам, но единственные статьи, с которыми я сталкиваюсь, - это объяснение проблем безопасности и то, как эти меры по их устранению.
Меня не интересует аспект безопасности - я тестирую критически важные для JavaScript фрагменты кода JavaScript на своей собственной машине, и единственное, что меня волнует, это то, что я получаю как можно более точные измерения с минимальными усилиями возможно.
Существующие обходные пути
На ум приходят два варианта:
- Установите старую версию браузера, в которой не реализованы эти меры по смягчению
Мне нужно было бы посвятить старую версию Firefox для бенчмаркинга и новую версию Chrome для просмотра, например. Это не практично, так как мне нужно тестировать во всех браузерах (и желательно также тестировать во всех браузерах). Кроме того, новые оптимизации не реализованы в старых браузерах, поэтому тесты могут оказаться бесполезными.
- Реализация пользовательского таймера с помощью WebWorkers
Я видел несколько более старых постов в блоге по этому вопросу, но ни одна из них, похоже, не достигла той высокой точности, которая мне нужна (в конце концов, для этого раньше было performance.now()
).
Вопрос
Как получить эффективный предварительный Призрак performance.now()
без необходимости прибегать к более старым версиям браузера, виртуальным машинам и т. П.?
Существуют ли какие-либо методы или библиотеки кодирования в JavaScript, обеспечивающие точность с точностью до микросекунды?
Есть ли какие-либо опции или флаги для 3 вышеупомянутых браузеров, которые отключают эти меры безопасности?
В конечном итоге я ищу способ точно измерить относительную производительность различных фрагментов кода по сравнению друг с другом - поэтому, если есть решение, которое дает мне тики, а не микросекунды, это было бы приемлемо, если только он точен и работает во всех браузерах.