2014-11-18 16 views
108

Zbadam potencjalne przyspieszenia zakończenia kodu przy użyciu mechanizmu wypełniania kodu klang. Opisany poniżej przepływ został znaleziony w rtags przez Andersa Bakkena.Szybsze kodowanie z clang

Jednostki tłumaczeniowe są analizowane przez pliki monitorowania demonów dla zmian. Robi się to pod nazwą clang_parseTranslationUnit i powiązanych funkcji (reparse*, dispose*). Gdy użytkownik żąda uzupełnienia w danej linii i kolumnie w pliku źródłowym, demon przekazuje buforowaną jednostkę tłumaczeniową dla ostatniej zapisanej wersji pliku źródłowego i bieżącego pliku źródłowego do clang_codeCompleteAt. (Clang CodeComplete docs).

Flagi przekazane do clang_parseTranslationUnit (od CompletionThread::process, line 271) to CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes. Flagi przekazane do clang_codeCompleteAt (od CompletionThread::process, line 305) to CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns.

Połączenie z numerem jest bardzo powolne - uzyskanie ukończenia trwa około 3-5 sekund, nawet w przypadkach, gdy lokalizacja zakończenia jest prawnie dozwolonym kodem dostępu członka, podzestaw zamierzonego przypadku użycia wymienionego w dokumentacji clang_codeCompleteAt. Wydaje się to o wiele za wolne dzięki standardom tworzenia kodu IDE. Czy istnieje sposób na przyspieszenie tego?

+0

Jakie flagi przekazujesz clang_parseTranslationUnit? – Cameron

+0

@Cameron Flagi przekazane do 'clang_parseTranslationUnit' (z [CompletionThread :: process, linii 271] (https://github.com/Andersbakken/rtags/blob/master/src/CompletionThread.cpp)) to' CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_SkipFunctionBodes'. Flagi przekazane do 'clang_codeCompleteAt' (z [CompletionThread :: process, line 305] (https://github.com/Andersbakken/rtags/blob/master/src/CompletionThread.cpp)) to' CXCodeComplete_IncludeMacros | CXCodeComplete_IncludeCodePatterns'. – Pradhan

+0

Hmm.Jakiego rodzaju plik jest gotowy - czy zawiera wiele nagłówków (np. Boost)? Jakie są opcje kompilacji? Czy Twój libclang jest skompilowany z optymalizacją? Niedługo sam wypróbuję libclanga - sprawdzę, czy dla mnie jest to wolne. – Cameron

Odpowiedz

4

Czasami opóźnienia o tej wielkości wynikają z przekroczenia limitu czasu zasobów sieciowych (udziały NFS lub CIFS na ścieżce lub gniazdach wyszukiwania plików). Spróbuj monitorować czas potrzebny na wykonanie każdego wywołania systemowego, dodając prefiks procesu, który wykonałeś z strace -Tf -o trace.out. Spójrz na liczby w nawiasach trójkątnych w trace.out, aby wywołanie systemowe zajęło dużo czasu.

Można także monitorować czas między wywołaniami systemowymi, aby zobaczyć, które przetwarzanie pliku trwa zbyt długo. Aby to zrobić, zmień prefiks procesu na strace -rf -o trace.out. Spójrz na liczbę przed każdym wywołaniem systemowym, aby znaleźć długie interwały systemowe. Przejdź od tego punktu wstecz, szukając połączeń open, aby zobaczyć, który plik był przetwarzany.

Jeśli to nie pomoże, możesz przeprowadzić proces, aby zobaczyć, gdzie spędza większość swojego czasu.

6

Problem związany z funkcją clang_parseTranslationUnit polega na tym, że prekompilowana preambuła nie jest ponownie używana po raz drugi, która jest nazywana uzupełnianiem kodu. Oblicz preambułę preambuły zajmuje więcej niż 90% z tych czasów, więc powinieneś pozwolić, aby prekompilowana preambuła była ponownie używana tak szybko, jak to możliwe.

Domyślnie jest ponownie wykorzystywany po raz trzeci, który jest wywoływany w celu przeanalizowania/przekształcenia jednostki tłumaczeniowej.

Zobacz zmienną "PreambleRebuildCounter" w pliku ASTUnit.cpp.

Innym problemem jest zapisanie tej preambuły w pliku tymczasowym. Możesz zatrzymać prekompilowaną preambułę w pamięci zamiast tymczasowego pliku. Byłoby szybciej. :)

+0

Awesome! Wygląda na to, że dochodzi do prawdziwego problemu. Przyjrzę się temu i dam ci znać. Dzięki! – Pradhan

+0

ok! daj mi znać, czy to działa dla Ciebie! a jeśli masz jakieś pytania, proszę zapytaj mnie !!!! – GutiMac