Skip to content

perf_hooks

perf_hooks เป็นโมดูลในตัวของ Node.js ที่ใช้สำหรับวัดประสิทธิภาพการทำงานของโค้ด

import { performance, PerformanceObserver } from 'node:perf_hooks';

APIคำอธิบายลักษณะคำอธิบายเพิ่มเติม
performance.now()วัดเวลาปัจจุบันSynchronousคืนค่าเวลาในหน่วย millisecond ตั้งแต่เริ่มต้นกระบวนการ
performance.mark()ทำเครื่องหมายจุดเวลาSynchronousใช้สำหรับวัดช่วงเวลาระหว่าง mark
performance.measure()วัดเวลาระหว่าง markSynchronousคำนวณเวลาระหว่าง mark สองจุด
PerformanceObserverตรวจจับและบันทึกเหตุการณ์ประสิทธิภาพAsynchronousใช้สำหรับติดตามการวัดประสิทธิภาพแบบไม่รบกวนการทำงานหลัก
performance.timerify()วัดเวลาการทำงานฟังก์ชันAsynchronousห่อหุ้มฟังก์ชันเพื่อวัดเวลาการทำงาน
performance.eventLoopUtilization()วัดการใช้ event loopSynchronousคืนค่าการใช้งาน 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());