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