Một nhà phát triển đã phát hiện ra rằng một lệnh tra cứu npx ẩn đã làm tăng thêm khoảng 10 giây cho mỗi lượt phản hồi của Claude Code, và việc thay thế lệnh tra cứu đó bằng một bản cài đặt toàn cục (global install) đã giúp tiết kiệm được sáu giây cho mỗi lần tương tác.

Tại sao độ trễ lại quan trọng

Claude Code điều hướng một monorepo với hàng chục thành phần, lập chỉ mục các ký hiệu (symbols), lưu trữ bản ghi (transcripts) trong Postgres và gửi các báo cáo lỗi. Quy trình làm việc có vẻ mượt mà cho đến khi các phản hồi của mô hình bắt đầu bị chậm trễ. Một đợt kiểm tra sức khỏe (health check) sau đó đã làm lộ ra một vài điểm kém hiệu quả và một lệnh gọi mạng tốn kém.

Những gì đợt kiểm tra sức khỏe đã phát hiện

  • Cài đặt trùng lặp – một trình khởi chạy gốc (native launcher) và một phiên bản npm-global lỗi thời cùng tồn tại. Việc xóa bản sao cũ đã loại bỏ một bước tra cứu đường dẫn không cần thiết.
  • Tệp agent bị lỗi – một tệp không có mô tả đã trùng tên với một tệp hợp lệ, khiến Claude Code bỏ qua nó. Việc xóa mục bị lỗi đã giải quyết được sự nhầm lẫn này.
  • Các tiện ích mở rộng không sử dụng – một plugin và một MCP server không bao giờ được kích hoạt đã bị vô hiệu hóa, giúp giảm bớt dấu chân runtime (runtime footprint).
  • Các tệp “CLAUDE.md” cồng kềnh – các tệp này lặp lại thông tin đã có sẵn trong mã nguồn (ví dụ: các lệnh build), làm tăng dung lượng dữ liệu (payload) gửi đến mô hình. Việc cắt giảm chúng giúp chỉ để lại những ngữ cảnh thiết yếu.

Những đợt dọn dẹp này đã giúp ích, nhưng chiến thắng lớn nhất đến từ Stop hook chạy sau mỗi phản hồi của mô hình.

"Thuế" npx ẩn

Stop hook thực thi sáu lệnh riêng biệt, mỗi lệnh đều có tiền tố npx -y. Cờ -y buộc npx phải kiểm tra npm registry để tìm phiên bản mới hơn trước khi chạy lệnh, từ đó kích hoạt một yêu cầu mạng. Mỗi lần tra cứu trung bình mất 1,6 giây, vì vậy sáu lần gọi đã cộng thêm khoảng 10 giây vào mỗi lượt. Trong thực tế, độ trễ tổng thể của hook đo được là 12 giây, với những lần tăng vọt lên tới 113 giây khi mạng gặp sự cố.

Cách khắc phục đơn giản

Việc thay thế các lệnh gọi npx bằng một tệp nhị phân (binary) được cài đặt toàn cục đã loại bỏ việc tra cứu registry:

  • Trước đó: npx -y @invariance/gps → 1,6 giây mỗi lần gọi
  • Sau đó: gps (đã cài đặt toàn cục) → 0,7 giây mỗi lần gọi

Thay đổi này đã cắt giảm thời gian chạy của Stop hook khoảng 6 giây mỗi lượt và loại bỏ những lần tăng vọt thời gian do việc kiểm tra từ xa gây ra.

Những điều cần lưu ý tiếp theo

  • Thời gian chạy hook – hãy đo lường (instrument) bất kỳ hook tùy chỉnh nào để phát hiện độ trễ trước khi nó ảnh hưởng đến người dùng.
  • Vệ sinh phụ thuộc (Dependency hygiene) – thường xuyên loại bỏ các bản cài đặt trùng lặp và các tiện ích mở rộng không sử dụng.
  • Các tệp cấu hình – giữ cho tệp “CLAUDE.md” gọn nhẹ; chỉ đưa ra những thông tin mà mô hình không thể tự suy luận được.

Bài học rất đơn giản: tự động hóa có thể che giấu những "đường ống" tốn kém. Một đợt kiểm tra sức khỏe nhanh chóng có thể tiết lộ các lệnh gọi mạng ẩn, thứ có thể biến một trợ lý AI mượt mà thành một trợ lý chậm chạp.

Bài học rút ra: Khi Claude Code có cảm giác chậm, hãy đo thời gian chạy của các hook và loại bỏ bất kỳ lệnh tra cứu npx nào; việc cài đặt toàn cục có thể cắt giảm được nhiều giây trong mỗi lượt và giữ cho luồng phát triển của bạn luôn trôi chảy.