aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Date.now hay performance.now: chọn đồng hồ để ghi thời điểm và đo thời lượng

Suong Nguyen by Suong Nguyen
30/10/2026
in Đánh giá
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Bạn cần ghi lúc một tác vụ bắt đầu và tác vụ mất bao lâu. Hai câu hỏi nghe gần nhau nhưng nên dùng hai loại dữ liệu khác nhau: thời điểm theo lịch để đối chiếu log, và khoảng thời gian trôi qua để đo duration. Dùng một giá trị cho cả hai dễ dẫn tới phép đo bị ảnh hưởng khi đồng hồ hệ thống được chỉnh.

Bài đối chiếu API ngày 30/10/2026, chạy ví dụ trên Node.js 24.18.1. Không có benchmark so tốc độ hai hàm, không cố tình chỉnh giờ máy. Các số mô phỏng bên dưới chỉ minh họa ý nghĩa phép trừ, không phải sự cố thời gian thực đã quan sát.

Hai mốc gốc khác nhau

Date.now() trả mili giây từ Unix epoch. Nó phù hợp khi cần một timestamp có thể chuyển sang ngày giờ và lưu cùng sự kiện. performance.now() trả số mili giây theo mốc của Performance; trong Node, giá trị 0 tương ứng lúc process bắt đầu.

const {performance} = require('node:perf_hooks');

const wallTimestamp = Date.now();
const processTimestamp = performance.now();
console.log(Number.isInteger(wallTimestamp));
console.log(Number.isFinite(processTimestamp));

Hai dòng in true. Chúng không chứng minh hai giá trị cùng đơn vị gốc hoặc có thể trừ trực tiếp cho nhau. Node 24.18.1 Performance APIs xác nhận mốc process của performance.now; Date.now reference xác nhận mốc epoch.

Dùng duration và timestamp song song

const startedAt = new Date().toISOString();
const start = performance.now();

const result = [3, 1, 2].toSorted((a, b) => a - b);
const durationMs = performance.now() - start;

console.log(startedAt.endsWith('Z'));
console.log(result.join(','));
console.log(Number.isFinite(durationMs), durationMs >= 0);

Kết quả kiểm tra là true, 1,2,3, rồi true true. Bài không công bố con số duration vì thao tác nhỏ này không phải phép thử hiệu năng đại diện. Timestamp ISO mô tả thời điểm bắt đầu theo UTC; duration mô tả đoạn đo trong cùng process.

Đặt ranh giới đo quanh đúng công việc cần quan sát. Thêm console.log vào giữa hai lần đọc đồng hồ sẽ đưa cả công việc ghi log vào duration. Nếu chỉ muốn đo một hàm, ghi log sau khi đã lấy mốc kết thúc.

Khi đồng hồ lịch dịch chuyển

Đồng hồ dùng cho performance được thiết kế đơn điệu, không lùi vì thao tác chỉnh giờ hệ thống. Performance.now reference phân biệt nó với Date.now. Điều đó không có nghĩa mọi môi trường đều bảo đảm độ phân giải vô hạn hoặc cùng hành vi khi máy ngủ.

const simulated = {
  wallStart: 10000,
  wallEnd: 9000,
  monotonicStart: 200,
  monotonicEnd: 700,
};
console.log(simulated.wallEnd - simulated.wallStart);
console.log(simulated.monotonicEnd - simulated.monotonicStart);

Đoạn giả lập in -1000 và 500. Nó cho thấy phép trừ hai thời điểm lịch có thể không phản ánh khoảng trôi qua nếu mốc lịch bị dịch chuyển. Đây không phải bằng chứng máy vừa bị chỉnh lùi một giây, cũng không phải phép đo độ trễ mạng.

Tác vụ async cần bao quanh phần được await

async function measuredTask(task) {
  const start = performance.now();
  const value = await task();
  return {value, durationMs: performance.now() - start};
}

measuredTask(() => Promise.resolve('done')).then(({value, durationMs}) => {
  console.log(value, durationMs >= 0);
});

Ví dụ in done true. Duration ở đây bao gồm đoạn chờ trong ranh giới await, không phải CPU time riêng của task. Nếu bỏ await và chỉ đo việc tạo Promise, bạn đang đo một công việc khác. Khi muốn ghi cả ca lỗi, thiết kế catch/finally và chính sách log riêng; hàm minh họa vẫn trả rejection khi task thất bại.

So sánh theo tiêu chí sử dụng

Tiêu chí Date.now performance.now
Dễ bắt đầu Có sẵn trên Date Có Performance API; Node dùng perf_hooks
Mốc và quyền kiểm soát Epoch, theo đồng hồ hệ thống Mốc Performance, phù hợp đo khoảng trong cùng phạm vi
Tích hợp Log, lưu timestamp, chuyển ngày giờ Instrumentation và duration
Hiệu năng Không benchmark trong bài Không benchmark trong bài
Chi phí duy trì Cần rõ UTC/timezone khi hiển thị Cần giữ đúng time origin và đơn vị
Trường hợp nên dùng Sự kiện xảy ra lúc nào Đoạn xử lý mất bao lâu

Đừng lưu riêng performance.now rồi gửi sang process khác để trừ trực tiếp với giá trị bên đó. Hai process có thể có mốc khác nhau. Với hệ thống phân tán, cần một thiết kế quan sát có hợp đồng thời gian và trace riêng.

Lỗi thường gặp và cách kiểm tra

  • Trừ Date.now cho performance.now vì cả hai đều ghi đơn vị ms.
  • Diễn giải duration chờ I/O thành CPU time.
  • Kết luận tối ưu từ một lần chạy thao tác quá nhỏ.
  • Coi nhiều chữ số thập phân là bằng chứng độ chính xác tương ứng trên mọi thiết bị.

Hãy lưu timestamp và duration thành hai trường có tên rõ ràng. Kiểm tra ranh giới đo, môi trường và số lượt quan sát trước khi dùng duration làm bằng chứng cho một thay đổi hiệu năng.

Nguồn tham khảo

  • Node.js 24.18.1: Performance measurement APIs
  • MDN: Date.now
  • MDN: Performance.now

Tags: Đo lườngJavaScriptNode.js
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Object.groupBy hay Map.groupBy: chọn theo kiểu khóa của nhóm

by Suong Nguyen
29/10/2026
0

So sánh hai API groupBy qua khóa string, khóa object và dữ liệu dùng chung để chọn đúng đầu ra cho ứng dụng.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

structuredClone hay JSON round-trip: chọn cách sao chép theo kiểu dữ liệu

by Suong Nguyen
28/10/2026
0

So sánh khả năng giữ Date, undefined, NaN và vòng tham chiếu bằng fixture Node.js, thay vì gọi mọi cách chuyển qua JSON là deep clone tương đương.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

URLSearchParams hay encodeURIComponent: chọn cách tạo query string có tiếng Việt

by Suong Nguyen
27/10/2026
0

So sánh hai cách dựng query theo tính đúng, tham số lặp, khả năng bảo trì và giới hạn, với fixture tiếng Việt chạy bằng Node.js.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Array.includes hay Set.has: chọn theo cách dữ liệu được tra cứu và cập nhật

by Suong Nguyen
26/10/2026
0

So sánh Array.includes và Set.has bằng hành vi, vòng đời cập nhật và chi phí tạo cấu trúc, không dựa vào một benchmark thiếu ngữ cảnh.

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native RefreshControl: giữ refreshing đúng vòng đời của lượt tải
  • Phỏng vấn JavaScript: await forEach không chờ các callback async
  • Android ACTION_VIEW: mở liên kết HTTPS và xử lý khi không có app nhận

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply