Теперь есть новый метод измерения микросекунд в javascript:
http://gent.ilcore.com/2012/06/better-timer-for-javascript.html
Однако в прошлом я нашел грубый метод получения точности 0,1 миллисекунды в JavaScript из миллисекундного таймера. Невозможно? Нет. Продолжай читать:
Я провожу несколько высокоточных экспериментов, которые требуют точности таймера с самопроверкой, и обнаружил, что могу надежно получить точность 0,1 миллисекунды с определенными браузерами на определенных системах.
Я обнаружил, что в современных веб-браузерах с ускорением на GPU в быстрых системах (например, четырехъядерный i7, где несколько ядер простаивают, только окно браузера) - теперь я могу доверять таймерам с точностью до миллисекунд. Фактически, это стало настолько точным на простаивающей системе i7, что я смог надежно получить ту же самую миллисекунду после более чем 1000 попыток. Только когда я пытаюсь сделать что-то вроде загрузки дополнительной веб-страницы или чего-то другого, точность в миллисекундах ухудшается (и я могу успешно определить свою собственную ухудшенную точность, выполнив временную проверку до и после, чтобы увидеть, не мое время обработки внезапно увеличилось до 1 или более миллисекунд - это помогает мне аннулировать результаты, на которые, вероятно, слишком отрицательно повлияли колебания ЦП).
Он стал настолько точным в некоторых браузерах с ускорением на GPU в четырехъядерных системах i7 (когда окно браузера является единственным окном), что я обнаружил, что мне хотелось бы получить доступ к таймеру с точностью 0,1 мс в JavaScript, поскольку точность наконец-то достигла в некоторых высокопроизводительных системах просмотра, чтобы сделать такую точность таймера целесообразной для определенных типов нишевых приложений, которые требуют высокой точности и где приложения могут самостоятельно проверять отклонения точности.
Очевидно, что если вы выполняете несколько проходов, вы можете просто выполнить несколько проходов (например, 10 проходов), а затем разделить их на 10, чтобы получить точность 0,1 миллисекунды. Это распространенный метод повышения точности - выполнить несколько проходов и разделить общее время на количество проходов.
ОДНАКО ... Если я могу выполнить только один проход определенного теста из-за необычно уникальной ситуации, я обнаружил, что могу получить точность 0,1 (а иногда и 0,01 мс), выполнив следующие действия:
Инициализация / калибровка:
- Запустите цикл занятости, чтобы дождаться увеличения таймера до следующей миллисекунды (выровняйте таймер с началом следующего миллисекундного интервала). Этот цикл занятости длится менее миллисекунды.
- Запустите еще один цикл занятости, чтобы увеличить счетчик, ожидая увеличения таймера. Счетчик показывает, сколько приращений счетчика произошло за одну миллисекунду. Этот цикл занятости длится одну полную миллисекунду.
- Повторяйте вышеуказанное, пока числа не станут сверхстабильными (время загрузки, JIT-компилятор и т. Д.). 4. ПРИМЕЧАНИЕ.: Стабильность числа дает вам достижимую точность в неработающей системе. Вы можете рассчитать дисперсию, если вам нужно самостоятельно проверить точность. В одних браузерах расхождения больше, в других - меньше. Больше на более быстрых системах и медленнее на более медленных системах. Последовательность тоже бывает разной. Вы можете сказать, какие браузеры более последовательны / точны, чем другие. Более медленные системы и загруженные системы приведут к большим различиям между проходами инициализации. Это может дать вам возможность отобразить предупреждающее сообщение, если браузер не обеспечивает достаточную точность для измерения 0,1 мс или 0,01 мс. Перекос таймера может быть проблемой, но некоторые целочисленные миллисекундные таймеры в некоторых системах увеличиваются довольно точно (прямо в точке), что приводит к очень согласованным значениям калибровки, которым вы можете доверять.
- Сохраните окончательное значение счетчика (или среднее значение последних нескольких проходов калибровки)
Тестирование одного прохода с точностью до миллисекунды:
- Запустите цикл занятости, чтобы дождаться увеличения таймера до следующей миллисекунды (выровняйте таймер с началом следующего миллисекундного интервала). Этот цикл занятости длится менее миллисекунды.
- Выполните задачу, которую хотите точно измерить временем.
- Проверить таймер. Это дает вам целое число миллисекунд.
- Запустите последний цикл занятости, чтобы увеличить счетчик, ожидая увеличения таймера. Этот цикл занятости длится менее миллисекунды.
- Разделите это значение счетчика на исходное значение счетчика от инициализации.
- Теперь у вас есть десятичная часть миллисекунд !!!!!!!!
ПРЕДУПРЕЖДЕНИЕ. Циклы занятости НЕ рекомендуются в веб-браузерах, но, к счастью, эти циклы занятости выполняются менее 1 миллисекунды каждый и выполняются всего несколько раз.
Такие переменные, как JIT-компиляция и колебания ЦП, добавляют огромные неточности, но если вы выполните несколько проходов инициализации, у вас будет полная динамическая перекомпиляция, и в конечном итоге счетчик установится на что-то очень точное. Убедитесь, что все циклы занятости - это одна и та же функция для всех случаев, чтобы различия в циклах занятости не приводили к различиям. Убедитесь, что все строки кода выполняются несколько раз, прежде чем вы начнете доверять результатам, чтобы позволить JIT-компиляторам уже стабилизироваться для полной динамической перекомпиляции (dynarec).
Фактически, я был свидетелем точности, приближающейся к микросекундам, на некоторых системах, но я пока не доверял этому. Но точность в 0,1 миллисекунды, похоже, работает достаточно надежно в простаивающей четырехъядерной системе, где я единственный браузер. Я пришел к научному тесту, в котором я мог выполнять только одноразовые проходы (из-за наличия уникальных переменных), и мне нужно было точно рассчитывать время каждого прохода, а не усреднять несколько повторных проходов, поэтому я и сделал это.
Я сделал несколько предварительных проходов и фиктивных проходов (также для урегулирования dynarec), чтобы проверить надежность точности 0,1 мс (оставалась стабильной в течение нескольких секунд), затем убрал руки с клавиатуры / мыши, пока выполнялся тест, затем сделал несколько пост-проходы для проверки надежности с точностью 0,1 мс (снова осталась стабильной). Это также подтверждает, что такие вещи, как изменения состояния питания или другие вещи, не происходили между до и после, что мешало результатам. Повторяйте предварительное и последующее тестирование между каждым тестом. После этого я был практически уверен, что промежуточные результаты были точными. Конечно, нет никаких гарантий, но это показывает, что в некоторых случаях в веб-браузере возможна точность <0,1 мс .
Этот метод полезен только в очень и очень нишевых случаях. Тем не менее, это буквально не будет на 100% бесконечно гарантировано, вы можете получить весьма надежную и даже научную точность в сочетании с несколькими уровнями внутренних и внешних проверок.