Saya sedang menyelidiki percepatan penyelesaian kode potensial saat menggunakan mekanisme penyelesaian kode clang. Alur yang dijelaskan di bawah ini adalah yang saya temukan di rtags , oleh Anders Bakken.
Unit terjemahan diurai oleh file pemantauan daemon untuk perubahan. Ini dilakukan oleh clang_parseTranslationUnit
fungsi yang dipanggil dan terkait ( reparse*
, dispose*
). Ketika pengguna meminta penyelesaian pada baris dan kolom tertentu dalam file sumber, daemon meneruskan unit terjemahan yang di-cache untuk versi terakhir yang disimpan dari file sumber dan file sumber saat ini ke clang_codeCompleteAt
. ( Dokumen Clang CodeComplete ).
Bendera yang diteruskan ke clang_parseTranslationUnit
(dari CompletionThread :: proses, baris 271 ) adalah CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes
. Bendera yang diteruskan ke clang_codeCompleteAt
(dari CompletionThread :: proses, baris 305 ) adalah CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns
.
Panggilan ke clang_codeCompleteAt
sangat lambat - dibutuhkan sekitar 3-5 detik untuk menyelesaikan bahkan dalam kasus di mana lokasi penyelesaian adalah kode akses anggota yang sah, bagian dari kasus penggunaan yang dimaksud yang disebutkan dalam dokumentasi clang_codeCompleteAt
. Ini tampaknya terlalu lambat menurut standar penyelesaian kode IDE. Apakah ada cara untuk mempercepatnya?
CXTranslationUnit_SkipFunctionBodies
,CXCodeComplete_IncludeMacros
,CXCodeComplete_IncludeCodePatterns
dan tidak melihat perbedaan yang signifikan pada basis kode saya bekerja dengan. Semuanya rata-rata sekitar 4 detik per penyelesaian. Saya rasa ini hanya karena ukuran TU.CXTranslationUnit_PrecompiledPreamble
memastikanreparseTU
sangat cepat. Namun, bahkan denganCXTranslationUnit_CacheCompletionResults
,clang_codeCompleteAt
sangat lambat untuk kasus penggunaan saya.Jawaban:
Masalah yang dimiliki clang_parseTranslationUnit adalah preamble yang telah dikompilasi sebelumnya tidak digunakan kembali untuk kedua kalinya yang disebut penyelesaian kode. Hitung preamble precompile membutuhkan lebih dari 90% dari waktu ini sehingga Anda harus membiarkan preamble yang telah dikompilasi digunakan kembali sesegera mungkin.
Secara default, ini digunakan kembali untuk ketiga kalinya yang dipanggil ke unit terjemahan parse / reparse.
Lihat variabel ini 'PreambleRebuildCounter' di ASTUnit.cpp.
Masalah lainnya adalah pembukaan ini disimpan dalam file sementara. Anda dapat menyimpan pendahuluan yang telah dikompilasi sebelumnya dalam memori sebagai ganti file sementara. Akan lebih cepat. :)
sumber
Kadang-kadang penundaan sebesar ini disebabkan oleh waktu tunggu pada sumber daya jaringan (NFS atau CIFS berbagi di jalur atau soket pencarian file). Coba pantau waktu yang dibutuhkan setiap panggilan sistem untuk menyelesaikan dengan mengawali proses yang Anda jalankan
strace -Tf -o trace.out
. Lihatlah angka dalam tanda kurung sikutrace.out
untuk panggilan sistem yang membutuhkan waktu lama untuk diselesaikan.Anda juga dapat memantau waktu antara panggilan sistem untuk melihat pemrosesan file mana yang membutuhkan waktu terlalu lama untuk diselesaikan. Untuk melakukan ini, awali proses yang Anda jalankan
strace -rf -o trace.out
. Lihat nomor sebelum setiap panggilan sistem untuk mencari interval panggilan sistem yang lama. Mundur dari titik itu mencariopen
panggilan untuk melihat file mana yang sedang diproses.Jika ini tidak membantu, Anda dapat membuat profil proses Anda untuk melihat di mana proses tersebut menghabiskan sebagian besar waktunya.
sumber