Dark mode
perf_hooks
perf_hooks เป็นโมดูลในตัวของ Node.js ที่ใช้สำหรับวัดประสิทธิภาพการทำงานของโค้ด
import { performance, PerformanceObserver } from 'node:perf_hooks';
API | คำอธิบาย | ลักษณะ | คำอธิบายเพิ่มเติม |
---|---|---|---|
performance.now() | วัดเวลาปัจจุบัน | Synchronous | คืนค่าเวลาในหน่วย millisecond ตั้งแต่เริ่มต้นกระบวนการ |
performance.mark() | ทำเครื่องหมายจุดเวลา | Synchronous | ใช้สำหรับวัดช่วงเวลาระหว่าง mark |
performance.measure() | วัดเวลาระหว่าง mark | Synchronous | คำนวณเวลาระหว่าง mark สองจุด |
PerformanceObserver | ตรวจจับและบันทึกเหตุการณ์ประสิทธิภาพ | Asynchronous | ใช้สำหรับติดตามการวัดประสิทธิภาพแบบไม่รบกวนการทำงานหลัก |
performance.timerify() | วัดเวลาการทำงานฟังก์ชัน | Asynchronous | ห่อหุ้มฟังก์ชันเพื่อวัดเวลาการทำงาน |
performance.eventLoopUtilization() | วัดการใช้ event loop | Synchronous | คืนค่าการใช้งาน event loop ในรูปแบบ utilization object |
ตัวอย่าง
การวัดเวลาพื้นฐาน
js
import { performance } from "perf_hooks";
// วัดเวลาการทำงาน
const start = performance.now();
// จำลองการทำงานที่ใช้เวลา
let sum = 0;
for (let i = 0; i < 1e6; i++) {
sum += i;
}
const end = performance.now();
console.log(`ใช้เวลา ${(end - start).toFixed(2)} มิลลิวินาที`);
การใช้ performance.mark() และ measure()
js
import { performance } from "perf_hooks";
// สร้าง mark
performance.mark("start");
// จำลองงานที่ใช้เวลา
setTimeout(() => {
performance.mark("end");
// วัดเวลาระหว่าง mark
performance.measure("Task Duration", "start", "end");
const measure = performance.getEntriesByName("Task Duration")[0];
console.log(`ใช้เวลา ${measure.duration.toFixed(2)} มิลลิวินาที`);
}, 1000);
การใช้ PerformanceObserver
js
import { performance, PerformanceObserver } from "perf_hooks";
// สร้าง observer เพื่อติดตามการวัดประสิทธิภาพ
const obs = new PerformanceObserver((items) => {
const entries = items.getEntries();
entries.forEach((entry) => {
console.log(`${entry.name}: ${entry.duration.toFixed(2)}ms`);
});
});
// เริ่มติดตามการวัดประสิทธิภาพประเภท 'measure'
obs.observe({ entryTypes: ["measure"] });
// วัดประสิทธิภาพ
performance.mark("A");
setTimeout(() => {
performance.mark("B");
performance.measure("A to B", "A", "B");
}, 500);
การวัดเวลาการทำงานฟังก์ชัน
js
import { performance, PerformanceObserver } from "perf_hooks";
function calculate() {
let result = 0;
for (let i = 0; i < 1e6; i++) {
result += Math.sqrt(i);
}
return result;
}
// ห่อหุ้มฟังก์ชันเพื่อวัดประสิทธิภาพ
const timedCalculate = performance.timerify(calculate);
// สร้าง observer
const obs = new PerformanceObserver((list) => {
const entries = list.getEntries();
console.log(`Function duration: ${entries[0].duration.toFixed(2)}ms`);
obs.disconnect();
});
obs.observe({ entryTypes: ["function"] });
// เรียกฟังก์ชันที่ถูกวัดเวลา
timedCalculate();
การวัดการใช้ Event Loop
js
import { performance } from "perf_hooks";
// วัดการใช้งาน event loop
const { utilization } = performance.eventLoopUtilization();
console.log("Event loop utilization:", utilization);
// วัดหลังจากทำงานบางอย่าง
setTimeout(() => {
const { utilization } = performance.eventLoopUtilization();
console.log("After work - utilization:", utilization);
}, 1000);
การเปรียบเทียบประสิทธิภาพ
js
import { performance } from "perf_hooks";
function version1() {
return "result".toUpperCase();
}
function version2() {
return "result".toLocaleUpperCase();
}
// วัดประสิทธิภาพแต่ละเวอร์ชัน
const start1 = performance.now();
for (let i = 0; i < 1e6; i++) version1();
const end1 = performance.now();
const start2 = performance.now();
for (let i = 0; i < 1e6; i++) version2();
const end2 = performance.now();
console.log(`Version 1: ${(end1 - start1).toFixed(2)}ms`);
console.log(`Version 2: ${(end2 - start2).toFixed(2)}ms`);
การวัดเวลาของ async function
js
import { performance, PerformanceObserver } from "perf_hooks";
async function fetchData() {
return new Promise(resolve => {
setTimeout(() => resolve("data"), 500);
});
}
// สร้าง observer
const obs = new PerformanceObserver((list) => {
const entries = list.getEntries();
console.log(`Async duration: ${entries[0].duration.toFixed(2)}ms`);
});
obs.observe({ entryTypes: ["function"] });
// ห่อหุ้มและเรียก async function
const timedFetch = performance.timerify(fetchData);
timedFetch().then(console.log);
การล้าง mark และ measure
js
import { performance } from "perf_hooks";
performance.mark("start");
// ... ทำงานบางอย่าง ...
performance.mark("end");
performance.measure("task", "start", "end");
// ดู entries ทั้งหมด
console.log(performance.getEntries());
// ล้าง mark และ measure
performance.clearMarks();
performance.clearMeasures();
// ตรวจสอบว่าถูกล้างแล้ว
console.log("After clear:", performance.getEntries());