כשאלפיות שנייה לא מספיקות – performance.now

הטיימר ברזולוציה גבוהה נוסף על ידי קבוצת העבודה WebPerf כדי לאפשר מדידה מדויקת יותר בפלטפורמת האינטרנט בהשוואה למה שהיה לנו עם +new Date ועם Date.now() החדש יותר.

לשם השוואה, אלה סוגי הערכים שתקבלו בתגובה:

Date.now()         //  1337376068250
performance.now()  //  20303.427000007

ניתן לראות שהפערים בין שני הערכים שלמעלה גדולים מאוד. performance.now() הוא מדידה של אלפיות שנייה בספרות צפות מאז שהדף הספציפי הזה התחיל להיטען (חותמת הזמן performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart), ליתר דיוק). אפשר לטעון שיכול להיות שזה היה מספר המילי-שניות מאז התחילת הזמן ב-Unix, אבל לרוב אפליקציות אינטרנט לא צריכות לדעת את המרחק בין היום ל-1970. המספר הזה נשאר ביחס לדף כי תבצעו השוואה בין שני מדידות או יותר.

זמן מונוטוני

יתרון נוסף הוא שאפשר להסתמך על כך שהזמן הוא מונוטוני. נבקש מהמהנדס של WebKit, טוני גנטילקור (Tony Gentilcore), להסביר את זה:

תרחישים לדוגמה

יש כמה מצבים שבהם כדאי להשתמש בטימר ברזולוציה גבוהה במקום לקבל חותמת זמן בסיסית:

  • השוואה לשוק
  • קוד ל-runloop של משחק או אנימציה
  • חישוב קצב הפריימים באופן מדויק
  • הוספת איתותים לפעולות או לאודיו כדי שהם יתרחשו בנקודות ספציפיות באנימציה או ברצף אחר מבוסס-זמן

זמינות

הטיימר ברזולוציה גבוהה זמין כרגע ב-Chrome (בגרסה היציבה) בתור window.performance.webkitNow(), והערך הזה שווה בדרך כלל לערך הארגומנט החדש שמוענק ל-callback של requestAnimationFrame. בקרוב מאוד, WebKit תסיר את הקידומת שלה והיא תהיה זמינה דרך performance.now(). קבוצת WebPerfWG במיוחד, בראשות Jatinder Mann מ-Microsoft, הצליחה מאוד להסיר את הקידומת מהתכונות שלה במהירות יחסית.

לסיכום, performance.now() הוא…

  • ערך double עם מיקרו-שניות בחלק השברוני
  • ביחס ל-navigationStart של הדף ולא לתחילת הזמן ב-UNIX
  • לא מוטה כששעת המערכת משתנה
  • זמין בגרסה היציבה של Chrome, ב-Firefox מגרסה 15 ואילך וב-IE10.