หากคุณต้องการที่จะได้รับเวลาในการประมวลฟังก์ชั่นในเครื่องพัฒนาท้องถิ่นของคุณคุณสามารถใช้เครื่องมือ profiling เบราว์เซอร์ของคุณหรือคำสั่งคอนโซลเช่นและconsole.time()
console.timeEnd()
เบราว์เซอร์ที่ทันสมัยทั้งหมดมีตัวสร้างโปรไฟล์ JavaScript ในตัว ผู้สร้างโปรไฟล์เหล่านี้ควรให้การวัดที่แม่นยำที่สุดเนื่องจากคุณไม่จำเป็นต้องแก้ไขโค้ดที่มีอยู่ซึ่งอาจส่งผลต่อเวลาในการทำงานของฟังก์ชัน
หากต้องการโปรไฟล์ JavaScript ของคุณ:
- ในChromeกดF12และเลือกโปรไฟล์แท็บแล้วเก็บรายละเอียด JavaScript CPU
- ใน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()
เป็นความละเอียดสองเท่าที่มีความละเอียดระดับมิลลิวินาทีย่อยซึ่งแสดงถึงจำนวนมิลลิวินาทีนับตั้งแต่เริ่มต้นการนำทางของหน้าเว็บ มันส่งคืนจำนวนไมโครวินาทีในเศษส่วน (เช่นค่า 1,000.123 คือ 1 วินาทีและ 123 microseconds)
now()
เพิ่มขึ้น monotonically นี้เป็นสิ่งสำคัญDate.getTime()
ที่สามารถอาจจะกระโดดไปข้างหน้าหรือแม้กระทั่งย้อนกลับในการโทรตามมา โดยเฉพาะถ้าเวลาของระบบปฏิบัติการมีการอัพเดท (เช่นการซิงโครไนซ์นาฬิกาอะตอม) Date.getTime()
จะได้รับการอัพเดตด้วย now()
รับประกันว่าจะเพิ่มขึ้น monotonically เสมอดังนั้นจึงไม่ได้รับผลกระทบจากเวลาระบบของ OS - มันจะเป็นเวลานาฬิกาแขวนผนังเสมอ (สมมติว่านาฬิกาแขวนของคุณไม่ได้เป็นอะตอม ... )
now()
สามารถนำมาใช้ในเกือบทุกสถานที่ที่new Date().getTime()
, + new Date
andt Date.now()
มี ยกเว้นที่Date
และnow()
เวลาที่ไม่ผสมเป็นDate
อยู่บนพื้นฐานของยูนิกซ์ยุค (จำนวนมิลลิวินาทีตั้งแต่ปี 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 นอกจากนี้ยังมีpolyfillsหลายแบบให้เลือก
หนึ่งในตัวเลือกอื่น ๆ สำหรับการวัดระยะเวลาการดำเนินการอยู่ในป่าเป็น UserTiming UserTiming พฤติกรรมคล้ายกับconsole.time()
และconsole.timeEnd()
แต่มันใช้เดียวกันความละเอียดสูงประทับเวลาที่now()
ใช้ (เพื่อให้คุณได้รับการย่อยมิลลิวินาที monotonically นาฬิกาที่เพิ่มขึ้น) และบันทึกการประทับเวลาและระยะเวลาที่จะ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 + นอกจากนี้ยังมีpolyfill (ซึ่งฉันเขียน)