Một API Node.js trả lời chậm, bạn tìm nguyên nhân thế nào trước khi sửa?
Gợi ý trả lời
Người phỏng vấn muốn biết bạn có làm việc dựa trên số đo thay vì đoán, và có hiểu vì sao một đoạn code chạy nhanh với dữ liệu nhỏ lại chậm khi dữ liệu lớn.
Bước đầu tiên là biết chậm ở đâu ở mức request. Nếu máy chủ có log ghi thời gian xử lý mỗi request, bạn lọc ra đường nào chậm. Nếu chưa có, hãy đo bằng performance.now() hoặc thêm log đó trước. Bước thứ hai là kiểm tra giả thuyết bằng cách đo riêng từng phần nghi ngờ (định dạng dữ liệu, chuyển JSON, truy vấn cơ sở dữ liệu): nếu một phần chỉ chiếm vài mili giây trên tổng vài giây thì đừng tối ưu nó. Bước thứ ba là dùng profiler, ví dụ cờ --cpu-prof của Node.js ghi file .cpuprofile, để xem hàm nào tốn nhiều thời gian riêng nhất.
Một nguyên nhân hay gặp là độ phức tạp tăng theo bình phương: dùng find hoặc includes trên một mảng ngay trong vòng lặp. Với vài trăm phần tử thì không thấy, với hàng chục nghìn thì chậm hẳn. Cách sửa thường là dùng Map hoặc Set để tìm theo khóa.
Sau khi sửa, kiểm chứng hai lần: kết quả có còn đúng không (giữ bản cũ để so, hoặc viết test) và nhanh hơn bao nhiêu (đo nhiều lần, lấy trung vị, ở nhiều cỡ dữ liệu để thấy hình dạng của đường tăng).
Điểm cộng: nhắc rằng không phải đoạn code nào cũng đáng tối ưu, bản dễ đọc ở quy mô nhỏ là quyết định hợp lý, và số đo chỉ đúng với máy và dữ liệu bạn đo.