Якщо вам потрібно отримати час виконання функції на вашій локальній машині розробки , ви можете скористатися інструментами профілювання вашого браузера або командами консолі, такими як console.time()
і console.timeEnd()
.
Усі сучасні браузери мають вбудовані профілі JavaScript. Ці профілі повинні дати найбільш точне вимірювання, оскільки вам не доведеться змінювати існуючий код, що може вплинути на час виконання функції.
Щоб профіль вашого JavaScript:
- У Chrome натисніть F12 та виберіть вкладку Профілі , а потім Зберіть профіль CPU JavaScript .
- У Firefox встановіть / відкрийте Firebug та натисніть кнопку Профіль .
- У IE 9+ натисніть F12 , клацніть на Script або Profiler (залежно від вашої версії IE).
Крім того, на вашій розроблювальній машині ви можете додати інструментарій у свій код за допомогою console.time()
та console.timeEnd()
. Ці функції, підтримувані в Firefox11 +, Chrome2 + та IE11 +, повідомляють про таймери, через які ви запускаєте / зупиняєте console.time()
. time()
приймає визначене користувачем ім'я таймеру в якості аргументу, а timeEnd()
потім звітує про час виконання з моменту запуску таймера:
function a() {
console.time("mytimer");
... do stuff ...
var dur = console.timeEnd("myTimer"); // NOTE: dur only works in FF
}
Зауважте, що тільки Firefox повертає минулий час у timeEnd()
виклику. Інші браузери просто повідомляють результат на консолі розробника: повернене значення timeEnd()
не визначено.
Якщо ви хочете отримати час виконання функції в природі , вам доведеться зафіксувати свій код. У вас є пара варіантів. Ви можете просто зберегти час початку та кінця за допомогою запиту new Date().getTime()
:
function a() {
var start = new Date().getTime();
... do stuff ...
var end = new Date().getTime();
var dur = end - start;
}
Однак Date
об’єкт має лише мілісекундну роздільну здатність і на нього впливатимуть будь-які зміни системних годин ОС. У сучасних браузерах є кращий варіант.
Кращий варіант - використовувати час високої роздільної здатності , ака window.performance.now()
. now()
є кращим від традиційного Date.getTime()
двома важливими способами:
now()
- це подвійний з субмілісекундною роздільною здатністю, який представляє кількість мілісекунд з початку навігації по сторінці. Він повертає кількість дробових мікросекунд (наприклад, значення 1000.123 становить 1 секунду і 123 мікросекунди).
now()
монотонно зростає. Це важливо , так як Date.getTime()
може , можливо , стрибати вперед або назад навіть при наступних викликах. Зокрема, якщо системний час ОС оновлено (наприклад, синхронізація атомних годин), Date.getTime()
також оновляється. now()
гарантовано завжди буде монотонно зростати, тому на нього не впливає системний час ОС - це завжди буде настінний час (якщо припустити, що ваші настінні годинники не є атомними ...).
now()
може використовуватися майже в будь-якому місці new Date().getTime()
, + new Date
яке Date.now()
є. Винятком є те, що Date
і now()
часи не змішуються, як Date
це базується на unix-epoch (кількість мілісекунд з 1970 року), тоді як now()
це кількість мілісекунд з моменту початку навігації на вашій сторінці (тому вона буде набагато меншою, ніж Date
).
Ось приклад використання now()
:
function a() {
var start = window.performance.now();
... do stuff ...
var end = window.performance.now();
var dur = end - start;
}
now()
підтримується в стабільній Chrome, Firefox 15+ та IE10. Також є кілька поліфілів .
Ще один варіант вимірювання часу виконання в природі - це UserTiming . UserTiming поводиться аналогічно console.time()
та console.timeEnd()
, але він використовує ту саму часову марку високої роздільної здатності, яка now()
використовується (таким чином, ви отримуєте монтонічно зростаючий годинник на півмільсекунди) і економить часові позначки та тривалість на шкалі PerformanceTimeline .
UserTiming має поняття позначок (часових позначок) та заходів (тривалості). Ви можете визначити стільки, скільки хочете, і вони виставляються на PerformanceTimeline .
Щоб зберегти часову позначку, ви телефонуєте mark(startMarkName)
. Щоб отримати тривалість з моменту першої оцінки, ви просто телефонуєте measure(measurename, startMarkname)
. Далі тривалість зберігається в параметрі PerformanceTimeline поряд із вашими позначками.
function a() {
window.performance.mark("start");
... do stuff ...
window.performance.measure("myfunctionduration", "start");
}
// duration is window.performance.getEntriesByName("myfunctionduration", "measure")[0];
UserTiming доступний в IE10 + та Chrome25 +. Також є поліфіл (про який я писав).