اندازهگیری زمان اجرا
گاهی برای سنجش کارایی باید ببینیم اجرای یک تابع چقدر طول میکشد، و برای همین startTask و taskEnd فراهم شدهاند. سه شیوهٔ دیگرِ زمانگیری هم معرفی میشود:
new Date().getTime(),console.time(),console.timeEnd(),performance.now()
I. startTask و taskEnd
1. startTask
پیش از آغاز کار صدایش بزنید.
بازگشت
| پارامتر | توضیح | نوع |
|---|---|---|
| taskId | شناسهٔ کار | unique symbol |
2. taskEnd
هنگام پایان کار صدایش بزنید؛ به شناسهای نیاز دارد که startTask برگردانده است.
گزینهها
| پارامتر | توضیح | نوع | پیشفرض |
|---|---|---|---|
| taskId | شناسهٔ کار | unique symbol | الزامی |
بازگشت
| پارامتر | توضیح | نوع |
|---|---|---|
time | زمانی که کار برد | number |
۳. نمونهٔ کاربرد
const taskId = startTask();
// کاری انجام بده
const time = taskEnd(taskId);
console.log('زمان اجرای کار:', time);II. new Date().getTime()
new Date().getTime() عددی برمیگرداند که شمار میلیثانیهها را از ۱ ژانویهٔ ۱۹۷۰، ساعت ۰۰:۰۰:۰۰ به وقت جهانی هماهنگ (UTC) تا زمانی که شیء تاریخ نشان میدهد بیان میکند. بهکار بردنش برای اندازهگیری زمان اجرای JS دو اشکال دارد:
- در برخی حالتها دقت میلیثانیه بس نیست.
- زمانی که
new Date()تفسیر میکند ممکن است در مرورگرها یا دستگاههای گوناگون یکسان نباشد. مستندات MDN
به سبب تفاوتها و ناسازگاریهای میان مرورگرها، بهشدت توصیه میشود برای تفسیر رشتههای تاریخ از سازندهٔ Date (یا Date.parse که همارز آن است) استفاده نکنید. تنها پشتیبانی متعارفی از تاریخهای قالب RFC 2822 وجود دارد. در قالب ISO 8601 نیز تنها رشتههای تاریخ (مانند «1970-01-01») بهجای وقت محلی، UTC در نظر گرفته میشوند که با رسیدگی به رشتههای دیگر فرق دارد.
III. console.time(), console.timeEnd()
زمانسنجی را آغاز میکند تا مدت یک عملیات را دنبال کند. هر زمانسنج نامی یکتا میخواهد و یک صفحه میتواند تا ۱۰٬۰۰۰ زمانسنج را همزمان بدواند. وقتی console.timeEnd() را با نام زمانسنج صدا بزنید، مرورگر مدت سپریشدهٔ آن را بر حسب میلیثانیه چاپ میکند. در سنجش با new Date().getTime()، این شیوه دقیقتر است و تا ۰٫۰۰۱ میلیثانیه (مثلاً 0.134ms) را میخواند.
IV. performance.now()
performance.now() زمان را با دقتی تا میکروثانیه برمیگرداند و به ساعت سامانه وابسته نیست (ساعت سامانه ممکن است دستی تنظیم شود یا NTP و نرمافزارهای دیگر دستکاریاش کنند). افزون بر این، performance.timing.navigationStart + performance.now() تقریباً برابر Date.now() است. پس برای اندازهگیری زمان اجرای JS، performance.now() گزینهٔ توصیهشدهتری است.
یادداشت: برای پاسداری در برابر حملههای زمانسنجی و اثرانگاری، دقت
performance.now()ممکن است بر پایهٔ تنظیمات مرورگر کاهش یابد. درFirefoxگزینهٔprivacy.reduceTimerPrecisionبهطور پیشفرض روشن است و مقدار پیشفرضش1msاست. روشن کردنprivacy.resistFingerprintingدقت را به ۱۰۰ میلیثانیه یا مقدارprivacy.resistFingerprinting.reduceTimerPrecision.microseconds— هر کدام بزرگتر باشد — تغییر میدهد.