Tối Ưu Hóa PBC
Tối ưu hóa pbc
Trong vài ngày gần đây, tôi đã thực hiện một số tối ưu hóa quan trọng cho thư viện pbc. Đây là một thay đổi lớn nên tôi quyết định viết blog để ghi lại quá trình này.
Điểm cải tiến đầu tiên là việc thiết kế một cơ chế cấp phát bộ nhớ heap riêng biệt cho đối tượng rmessage. Thay vì sử dụng hàm malloc của hệ thống khi giải nén dữ liệu, chúng tôi chuyển sang phân bổ bộ nhớ từ một vùng nhớ liên tục chuyên dụng. Điều này giúp quá trình xóa đối tượng rmessage trở nên nhanh chóng hơn đáng kể, vì chúng ta chỉ cần giải phóng toàn bộ vùng nhớ heap mà không cần quản lý chi tiết từng khối nhớ riêng lẻ. Tuy nhiên, cách tiếp cận này sẽ làm tăng lượng bộ nhớ sử dụng trong quá trình giải nén. Trong các trường hợp giới hạn bộ nhớ hoặc yêu cầu hiệu năng cao, tôi vẫn khuyến nghị sử dụng chế độ pattern - dù giao diện lập trình này phức tạp hơn nhưng lại kiểm soát chặt chẽ cả về mặt thời gian và không gian bộ nhớ.
Một cải tiến quan trọng khác là tích hợp chế độ phân tích cú pháp dựa trên sự kiện (Event-based parsing) của upb. Giao diện mới được thêm vào là pbc_decode
. Chúng tôi nhận thấy giao diện này không phù hợp với việc sử dụng trực tiếp trong C, nhưng lại rất hiệu quả khi xây dựng lớp liên kết (binding) cho các ngôn ngữ lập trình động. Hiện tại, chức năng giải nén trong binding của Lua đã được chuyển sang sử dụng giao diện này. Bằng cách này, mọi lần giải nén sẽ xử lý toàn bộ dữ liệu cùng lúc mà không cần duy trì đối tượng userdata phụ trợ. Đặc biệt, vấn đề phải gọi thủ công hàm close_decoder
cũng được giải quyết triệt để.
Phản hồi từ người dùng cho thấy phần lớn người dùng không chủ động gọi close_decoder
mà dựa vào cơ chế thu gom rác (GC) của Lua để giải phóng các đối tượng C được tạo ra trong quá trình giải nén. Tuy nhiên, bộ nhớ được cấp phát bởi các đối tượng C này không được báo cáo chính xác cho hệ thống Lua, dẫn đến việc kích hoạt GC không kịp thời. Điều này khiến binding của pbc trong Lua có thể tiêu tốn lượng lớn bộ nhớ hệ thống. Phiên bản cập nhật lần này tập trung khắc phục vấn đề này, đảm bảo việc sử dụng bộ nhớ hiệu quả hơn và đồng bộ với cơ chế quản lý tài nguyên của Lua.