Ich untersuche mögliche Beschleunigungen der Code-Vervollständigung, während ich den Code-Vervollständigungsmechanismus von clang verwende. Der unten beschriebene Ablauf ist der, den ich in rtags von Anders Bakken gefunden habe.
Übersetzungseinheiten werden von einem Dämon analysiert, der Dateien auf Änderungen überwacht. Dies geschieht durch aufgerufene clang_parseTranslationUnit
und verwandte Funktionen ( reparse*
, dispose*
). Wenn der Benutzer eine Vervollständigung in einer bestimmten Zeile und Spalte in einer Quelldatei anfordert, übergibt der Dämon die zwischengespeicherte Übersetzungseinheit für die zuletzt gespeicherte Version der Quelldatei und die aktuelle Quelldatei an clang_codeCompleteAt
. ( Clang CodeComplete-Dokumente ).
Die an clang_parseTranslationUnit
(von CompletionThread :: process, Zeile 271 ) übergebenen Flags sind CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes
. Die an clang_codeCompleteAt
(von CompletionThread :: process, Zeile 305 ) übergebenen Flags sind CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns
.
Der Aufruf von clang_codeCompleteAt
ist sehr langsam - es dauert ungefähr 3-5 Sekunden, um eine Vervollständigung zu erhalten, selbst wenn der Vervollständigungsort ein legitimer Mitgliedszugriffscode ist, eine Teilmenge des beabsichtigten Anwendungsfalls, der in der Dokumentation von erwähnt wird clang_codeCompleteAt
. Dies scheint nach IDE-Code-Vervollständigungsstandards viel zu langsam zu sein. Gibt es eine Möglichkeit, dies zu beschleunigen?
CXTranslationUnit_SkipFunctionBodies
, CXCodeComplete_IncludeMacros
, CXCodeComplete_IncludeCodePatterns
und nicht sehen einen signifikanten Unterschied auf der Code - Basis mit denen ich arbeite. Alle durchschnittlich etwa 4 Sekunden pro Abschluss. Ich denke, das liegt nur an der Größe der TUs. CXTranslationUnit_PrecompiledPreamble
sorgt dafür, dass reparseTU
es sehr schnell geht. Aber auch mit CXTranslationUnit_CacheCompletionResults
, clang_codeCompleteAt
langsam ist schmerzlich für meinen Anwendungsfall.