เวลาในหน่วยมิลลิวินาทีไม่เพียงพอ - performance.now

คณะทำงาน WebPerf ได้เพิ่มตัวจับเวลาความละเอียดสูงเพื่อให้การวัดในแพลตฟอร์มเว็บมีความแม่นยำมากกว่าที่เราเคยมีใน +new Date และ Date.now() เวอร์ชันใหม่

ต่อไปนี้คือค่าประเภทต่างๆ ที่คุณจะได้รับเพื่อเปรียบเทียบ

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

คุณจะเห็นค่า 2 ค่าข้างต้นแตกต่างกันหลายลำดับขั้น performance.now() คือการวัดค่ามิลลิวินาทีแบบทศนิยมลอยตัวนับตั้งแต่หน้าเว็บนั้นๆ เริ่มโหลด (timeStamp ของ performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart) นั่นเอง) คุณอาจโต้แย้งว่าอาจเป็นจํานวนมิลลิวินาทีนับจากยุค Unix แต่เว็บแอปแทบไม่จําเป็นต้องทราบระยะห่างระหว่างปัจจุบันกับปี 1970 ตัวเลขนี้จะยังคงสัมพันธ์กับหน้าเว็บเนื่องจากคุณจะเปรียบเทียบการวัดผลตั้งแต่ 2 รายการขึ้นไป

เวลาแบบโมโนโทนิก

ข้อดีอีกอย่างหนึ่งคือคุณสามารถไว้วางใจได้ว่าเวลาจะเป็นแบบ Monotonic เรามาฟังคำอธิบายจาก Tony Gentilcore วิศวกร WebKit

กรณีการใช้งาน

สถานการณ์ที่คุณควรใช้ตัวจับเวลาความละเอียดสูงนี้แทนการจับการประทับเวลาพื้นฐานมีดังนี้

  • การเปรียบเทียบ
  • โค้ด Runloop ของเกมหรือภาพเคลื่อนไหว
  • การคำนวณอัตราเฟรมอย่างแม่นยำ
  • การกำหนดเวลาให้การดำเนินการหรือเสียงเกิดขึ้นที่จุดใดจุดหนึ่งในภาพเคลื่อนไหวหรือลำดับอื่นๆ ตามเวลา

ความพร้อมใช้งาน

ปัจจุบันตัวจับเวลาความละเอียดสูงพร้อมใช้งานใน Chrome (เวอร์ชันเสถียร) เป็น window.performance.webkitNow() และโดยทั่วไปค่านี้จะเท่ากับค่าอาร์กิวเมนต์ใหม่ที่ส่งไปยังการเรียกกลับ requestAnimationFrame ในเร็วๆ นี้ WebKit จะยกเลิกคำนำหน้าและจะพร้อมใช้งานผ่าน performance.now() โดยเฉพาะอย่างยิ่ง WebPerfWG ซึ่งนำโดย Jatinder Mann จาก Microsoft ประสบความสำเร็จอย่างมากในการนำคำนำหน้าออกของฟีเจอร์ต่างๆ อย่างรวดเร็ว

โดยสรุป performance.now() คือ...

  • ตัวเลขทศนิยมแบบ Double ที่มีไมโครวินาที
  • สัมพันธ์กับ navigationStart ของหน้าเว็บ ไม่ใช่กับยุค UNIX
  • ไม่บิดเบือนเมื่อเวลาของระบบเปลี่ยนแปลง
  • ใช้ได้ใน Chrome เวอร์ชันเสถียร, Firefox 15 ขึ้นไป และ IE10