Giới thiệu về API Hiệu suất Node.js

Node.js cung cấp các công cụ mạnh mẽ để đo lường và tối ưu hiệu suất của các ứng dụng. Một trong những công cụ đó là Performance API, cho phép các nhà phát triển ghi lại dấu thời gian độ phân giải cao và nhiều chỉ số hiệu suất khác nhau. Hãy tìm hiểu thêm về nó.

Minh Triết

Minh Triết

4 tháng 6 2025

Giới thiệu về API Hiệu suất Node.js

Node.js cung cấp các công cụ mạnh mẽ để đo lường và tối ưu hóa hiệu suất của các ứng dụng của bạn. Một trong những công cụ đó là Performance API, cho phép các lập trình viên ghi lại dấu thời gian độ phân giải cao và các chỉ số hiệu suất khác nhau. Hướng dẫn này sẽ giới thiệu cho bạn các thành phần chính của Node.js Performance API và cách sử dụng chúng một cách hiệu quả.

Tại sao hiệu suất quan trọng trong Node.js

Node.js nổi bật với kiến trúc hướng sự kiện và bất đồng bộ, rất thích hợp cho các tác vụ phụ thuộc vào I/O. Tuy nhiên, ngay cả trong môi trường không chặn này, hiệu suất vẫn là yếu tố quan trọng. Ứng dụng chậm dẫn đến người dùng thất vọng và cản trở khả năng mở rộng. Việc xác định nút thắt và tối ưu hóa mã trở nên cần thiết để có trải nghiệm người dùng liền mạch.

Bạn có quan tâm đến việc tăng thời gian phản hồi API của mình? Bài viết sau đây cung cấp một hướng dẫn từng bước về cách để tăng thời gian phản hồi API của bạn.

Tại sao sử dụng Node.js Performance API?

  1. Xác định các nút thắt hiệu suất: Các nút thắt hiệu suất có thể làm giảm đáng kể trải nghiệm người dùng. Bằng cách sử dụng Performance API, các lập trình viên có thể xác định chính xác những thời điểm mà các độ trễ xảy ra, cho dù trong việc thực thi chức năng, tải tài nguyên, hay xử lý yêu cầu HTTP. Độ chính xác này cho phép tối ưu hóa có mục tiêu.
  2. Tối ưu hóa việc sử dụng tài nguyên: Theo dõi hiệu suất giúp hiểu cách mà các tài nguyên như CPU và bộ nhớ đang được sử dụng. Bằng cách xác định việc sử dụng tài nguyên không hiệu quả, các lập trình viên có thể tối ưu hóa mã của họ để hiệu quả hơn, giảm chi phí và cải thiện khả năng mở rộng.
  3. Cải thiện trải nghiệm người dùng: Các ứng dụng phản hồi nhanh chóng cung cấp trải nghiệm người dùng tốt hơn. Performance API giúp đo lường các chỉ số quan trọng như Thời gian đến Byte đầu tiên (TTFB) và Sắc thái nội dung đầu tiên (FCP), cho phép các lập trình viên thực hiện những cải tiến dẫn tới thời gian tải nhanh hơn và tương tác mượt mà hơn.
  4. Cải thiện độ ổn định của ứng dụng: Việc theo dõi hiệu suất liên tục giúp phát hiện các bất thường và vấn đề tiềm ẩn trước khi chúng trở nên nghiêm trọng. Cách tiếp cận chủ động này đảm bảo thời gian hoạt động và độ tin cậy cao hơn cho ứng dụng.

Giới thiệu về Node.js Performance API

Performance API, có thể truy cập qua mô-đun perf_hooks, trang bị cho các lập trình viên Node.js một bộ công cụ toàn diện để đo lường và phân tích hiệu suất ứng dụng. Nó cung cấp một lợi thế lớn hơn so với các phương pháp truyền thống như Date.now(), mang lại thời gian ghi lại độ phân giải cao và một cách tiếp cận có cấu trúc hơn để đánh giá hiệu suất. Trong phương pháp Date.now(), bạn sẽ thấy một cái gì đó như;

const startTime = Date.now();
// gọi một hàm để thực hiện một tác vụ()
console.log(`Thời gian thực hiện tác vụ: ${Date.now() - startTime} milliseconds`);

Hàm Date.now() hoạt động tốt, nhưng một lần nữa, mặc dù có vẻ đơn giản, phương pháp này có thể không đáng tin cậy vì sự thay đổi hệ thống đồng hồ có thể làm sai lệch các phép đo.

Đây chính là lúc Node.js Performance API xuất hiện. Chúng ta muốn có thể đo lường đầy đủ việc sử dụng thời gian ứng dụng của mình mà không bị phiền bởi các vấn đề như đồng hồ hệ thống, đúng không?

Node.js Performance API được xây dựng quanh một số phương pháp và lớp cốt lõi được cung cấp bởi mô-đun perf_hooks. Bao gồm:

  1. performance.now(),
  2. performance.mark(),
  3. performance.measure(), và
  4. PerformanceObserver.

Mỗi công cụ này phục vụ một mục đích khác biệt trong việc ghi lại và phân tích các chỉ số hiệu suất.

Sử dụng performance.now()

Phương pháp performance.now() trả về một dấu thời gian độ phân giải cao tính bằng mili-giây. Điều này hữu ích cho việc đo lường thời gian giữa các phần của ứng dụng của bạn với độ chính xác cao hơn so với Date.now().

Để lấy thời gian thực hiện của một tác vụ, hãy thêm phương pháp performance.now() vào đầu và cuối của hoạt động mà bạn muốn đo lường như sau;

const { performance } = require('node:perf_hooks');
const start = performance.now();
// Thực hiện một số hoạt động
const end = performance.now();
console.log(`Thời gian: ${end - start} ms`);

Trước hết, chúng ta nhập performance từ các mô-đun node, và sau đó chúng ta tạo các hằng số start và end và gán các phương thức performance.now cho chúng để lấy thời gian chính xác của hoạt động.

Kết quả của mã trên sẽ trông như sau;

Thời gian: 1253.**** ms.

Sử dụng performance.mark()

Phương pháp performance.mark() trong Node.js cho phép bạn tạo ra những dấu thời gian có tên (hay các dấu) tại các điểm cụ thể trong mã của bạn. Những dấu này giúp bạn đo lường thời gian giữa các phần khác nhau của ứng dụng, mang lại cho bạn cái nhìn sâu sắc về các nút thắt hiệu suất.

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

performance.mark('A');
// Một số hoạt động
performance.mark('B');

Trong ví dụ này, performance.mark('A') và performance.mark('B') tạo ra hai dấu được gán nhãn 'A' và 'B', tương ứng.

Các dấu cũng có thể bao gồm thông tin chi tiết bổ sung, có thể hữu ích cho việc gỡ lỗi hoặc phân tích thêm.
performance.mark('A', { detail: 'Bắt đầu hoạt động' }); performance.mark('B', { detail: 'Kết thúc hoạt động' });

Ở đây, thuộc tính detail cung cấp thông tin bổ sung về những gì mà mỗi dấu đại diện.
Khi bạn đã tạo ra các dấu, bạn có thể đo lường thời gian giữa chúng bằng cách sử dụng performance.measure().

Sử dụng performance.measure()

performance.measure() là một hàm trong Performance API của Node.js mà tính toán thời gian giữa hai điểm đã đánh dấu trong dòng thời gian thực hiện của ứng dụng của bạn. Nó về cơ bản tạo ra một mục đo lường và lưu trữ thời gian đã trôi qua để sử dụng lại và phân tích sau này.

Nhớ rằng trong phần performance.mark(), chúng ta đã tạo ra hai dấu: A & B. Trong phần này, chúng ta sẽ thử nghiệm chúng và xem cách mà performance.mark() hoạt động với performance.measure().

performance.measure('A đến B', 'A', 'B');
const measures = performance.getEntriesByType('measure');
measures.forEach(measure => {
  console.log(`${measure.name}: ${measure.duration}ms`);
});

Điều này sẽ tạo ra một phép đo có tên 'A đến B', tính toán thời gian đã trôi qua giữa các dấu 'A' và 'B'.

Khi bạn chạy mã trên, kết quả sẽ hiển thị thời gian giữa hai dấu 'A' và 'B'. Đây là một ví dụ về những gì mà console có thể in ra:

A đến B: 12.345ms

Kết quả này cho thấy rằng các hoạt động giữa các dấu 'A' và 'B' mất khoảng 12.345 mili-giây để hoàn tất.

Sử dụng PerformanceObserver

Giao diện PerformanceObserver trong Node.js cho phép các lập trình viên theo dõi không đồng bộ và xử lý các mục hiệu suất như dấu, phép đo và các mục thời gian tài nguyên. Nó đặc biệt hữu ích để theo dõi và phản ứng với dữ liệu hiệu suất khi nó được thu thập, làm cho nó trở thành một công cụ thiết yếu cho phân tích và tối ưu hóa hiệu suất theo thời gian thực.

Để sử dụng PerformanceObserver, bạn cần tạo một thể hiện của nó và định nghĩa một hàm callback sẽ xử lý các mục hiệu suất. Đây là một thiết lập cơ bản:

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

const observer = new PerformanceObserver((list) => {
  list.getEntries().forEach((entry) => {
    console.log(entry);
  });
});

observer.observe({ entryTypes: ['mark', 'measure'] });

Trong ví dụ này:

  1. Nhập PerformanceObserverperformance: Các đối tượng PerformanceObserverperformance được nhập từ mô-đun perf_hooks.
  2. Tạo một Observer: Một thể hiện của PerformanceObserver được tạo ra với một hàm callback. Hàm này được gọi mỗi khi có các mục hiệu suất mới được ghi nhận.
  3. Theo dõi các loại mục: Phương thức observer.observe được gọi với một đối tượng chỉ định các loại mục để theo dõi (markmeasure trong trường hợp này).

Các trường hợp sử dụng thực tiễn cho PerformanceObserver

1. Theo dõi hiệu suất theo thời gian thực:

2. Phân tích việc tải tài nguyên:

3. Gỡ lỗi và phân tích hiệu suất:

4. Các chỉ số hiệu suất tùy chỉnh:

Kiểm thử ứng dụng trong Node.js

Cho đến nay, chúng ta đã tìm hiểu về Node.js Performance API, tại sao nó quan trọng, cách nó hoạt động, và cách mà nó khác với hàm mặc định Date.now().

Nếu bạn đang xây dựng một ứng dụng, bạn sẽ muốn tập trung vào việc xây dựng ứng dụng của mình và để việc kiểm thử cho các dịch vụ khác. Vâng, nhờ vào Apidog, bạn có thể kiểm thử các API và ứng dụng của mình.

Kiểm thử hiệu suất API bởi Apidog

Apidog là một công cụ mạnh mẽ được thiết kế đặc biệt cho việc kiểm thử API, bao gồm cả kiểm thử hiệu suất. Nó cung cấp các giải pháp toàn diện để tạo, quản lý và kiểm thử API. Apidog cho phép bạn mô phỏng hành vi API, định nghĩa các trường hợp thử nghiệm, và tạo báo cáo chi tiết. Với giao diện trực quan của mình, bạn có thể dễ dàng cấu hình các bài kiểm tra hiệu suất, phân tích thời gian phản hồi và xác định các nút thắt về hiệu suất.

button

Kết luận

Node.js Performance API, bao gồm các công cụ như performance.mark(), performance.measure(), và PerformanceObserver, cung cấp cho các lập trình viên khả năng mạnh mẽ để theo dõi và tối ưu hóa hiệu suất ứng dụng. Bằng cách tận dụng những công cụ này, bạn có thể có được cái nhìn chính xác về các đặc điểm hiệu suất của ứng dụng Node.js của mình, xác định các nút thắt, và thực hiện các tối ưu hóa có mục tiêu nhằm nâng cao hiệu quả và trải nghiệm người dùng.

Ngoài Performance API, việc áp dụng các thực tiễn tốt nhất về APIs/ứng dụng, và kiểm thử tải năng động và theo dõi có thể nâng cao đáng kể hiệu suất tổng thể của các ứng dụng của bạn. Những nỗ lực kết hợp này đảm bảo rằng các ứng dụng Node.js của bạn hoạt động trơn tru, mở rộng hiệu quả và cung cấp trải nghiệm người dùng tuyệt vời, do đó giữ được lợi thế cạnh tranh trên thị trường.

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API