Penyelesaian kode lebih cepat dengan dentang

108

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_parseTranslationUnitfungsi 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_codeCompleteAtsangat 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?

Pradhan
sumber
8
Saya akan dengan senang hati membantu Anda, tetapi kami membutuhkan informasi yang lebih spesifik. Kode contoh akan bagus untuk permulaan
raph.amiard
1
Ping. Apakah ada kemajuan dalam masalah ini?
Mehrwolf
4
@Cameron Maaf atas penundaan yang lama untuk menghubungi Anda kembali. Saya mencoba semua 8 kombinasi CXTranslationUnit_SkipFunctionBodies, CXCodeComplete_IncludeMacros, CXCodeComplete_IncludeCodePatternsdan 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_PrecompiledPreamblememastikan reparseTUsangat cepat. Namun, bahkan dengan CXTranslationUnit_CacheCompletionResults, clang_codeCompleteAtsangat lambat untuk kasus penggunaan saya.
Pradhan
1
@Tokopedia Lihat komentar di atas.
Pradhan
7
Hmm, sayang sekali. Dapatkah Anda mereproduksi kelambatan penyelesaian pada unit terjemahan yang tersedia untuk umum (misalnya sumber terbuka)? Akan membantu jika kami dapat mereproduksi ini sendiri. Penyelesaiannya harus kira-kira secepat reparse, karena itulah yang dilakukannya secara internal (ini menyuntikkan token penyelesaian kode khusus dan mem-parsing hingga titik itu).
Cameron

Jawaban:

6

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. :)

GutiMac
sumber
Hebat! Ini terdengar seperti masalah sebenarnya. Akan melihat ini dan memberi tahu Anda. Terima kasih!
Pradhan
baik! beri tahu saya jika itu berhasil untuk Anda! dan jika Anda memiliki pertanyaan, jangan ragu untuk bertanya kepada saya !!!!
GutiMac
4

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 siku trace.outuntuk 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 mencari openpanggilan 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.

Diomidis Spinellis
sumber