Tôi đang điều tra tốc độ hoàn thành mã tiềm năng trong khi sử dụng cơ chế hoàn thành mã của clang. Luồng được mô tả bên dưới là những gì tôi tìm thấy trong rtags , của Anders Bakken.
Các đơn vị dịch được phân tích cú pháp bởi tệp giám sát daemon để tìm các thay đổi. Điều này được thực hiện bởi clang_parseTranslationUnit
các hàm được gọi và liên quan ( reparse*
, dispose*
). Khi người dùng yêu cầu hoàn thành tại một dòng và cột nhất định trong tệp nguồn, daemon sẽ chuyển đơn vị dịch được lưu trong bộ nhớ cache cho phiên bản đã lưu cuối cùng của tệp nguồn và tệp nguồn hiện tại tới clang_codeCompleteAt
. ( Tài liệu Clang CodeComplete ).
Các cờ được chuyển đến clang_parseTranslationUnit
(từ quá trình hoàn thành ::, dòng 271 ) là CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes
. Các lá cờ được chuyển đến clang_codeCompleteAt
(từ quá trình hoàn thành ::, dòng 305 ) là CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns
.
Lệnh gọi tới clang_codeCompleteAt
rất chậm - mất khoảng 3-5 giây để hoàn thành ngay cả trong trường hợp vị trí hoàn thành là mã truy cập thành viên hợp pháp, một tập hợp con của trường hợp sử dụng dự kiến được đề cập trong tài liệu của clang_codeCompleteAt
. Điều này có vẻ quá chậm theo các tiêu chuẩn hoàn thành mã IDE. Có cách nào để tăng tốc độ này không?
CXTranslationUnit_SkipFunctionBodies
, CXCodeComplete_IncludeMacros
, CXCodeComplete_IncludeCodePatterns
và không thấy sự khác biệt đáng kể trên codebase tôi đang làm việc với. Tất cả chúng trung bình khoảng 4 giây mỗi lần hoàn thành. Tôi đoán điều này chỉ là do kích thước của các TU. CXTranslationUnit_PrecompiledPreamble
đảm bảo reparseTU
là rất nhanh. Tuy nhiên, ngay cả với CXTranslationUnit_CacheCompletionResults
, clang_codeCompleteAt
rất chậm đối với trường hợp sử dụng của tôi.