Skip to content

اندازه‌گیری زمان اجرا

گاهی برای سنجش کارایی باید ببینیم اجرای یک تابع چقدر طول می‌کشد، و برای همین startTask و taskEnd فراهم شده‌اند. سه شیوهٔ دیگرِ زمان‌گیری هم معرفی می‌شود:

  1. new Date().getTime(),
  2. console.time() , console.timeEnd(),
  3. performance.now()

I. startTask و taskEnd

1. startTask

پیش از آغاز کار صدایش بزنید.

بازگشت

پارامترتوضیحنوع
taskIdشناسهٔ کارunique symbol

2. taskEnd

هنگام پایان کار صدایش بزنید؛ به شناسه‌ای نیاز دارد که startTask برگردانده است.

گزینه‌ها

پارامترتوضیحنوعپیش‌فرض
taskIdشناسهٔ کارunique symbolالزامی

بازگشت

پارامترتوضیحنوع
timeزمانی که کار بردnumber

۳. نمونهٔ کاربرد

js
const taskId = startTask();

// کاری انجام بده

const time = taskEnd(taskId);

console.log('زمان اجرای کار:', time);

II. new Date().getTime()

new Date().getTime() عددی برمی‌گرداند که شمار میلی‌ثانیه‌ها را از ۱ ژانویهٔ ۱۹۷۰، ساعت ۰۰:۰۰:۰۰ به وقت جهانی هماهنگ (UTC) تا زمانی که شیء تاریخ نشان می‌دهد بیان می‌کند. به‌کار بردنش برای اندازه‌گیری زمان اجرای JS دو اشکال دارد:

  1. در برخی حالت‌ها دقت میلی‌ثانیه بس نیست.
  2. زمانی که 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 — هر کدام بزرگ‌تر باشد — تغییر می‌دهد.

منتشرشده تحت مجوز MIT.