【发布时间】:2015-01-15 08:23:35
【问题描述】:
我正在研究使用 clang 的代码完成机制时潜在的代码完成加速。下面描述的流程是我在 Anders Bakken 的 rtags 中找到的。
翻译单元由监视文件的守护程序解析以进行更改。这是通过调用clang_parseTranslationUnit 和相关函数(reparse*、dispose*)来完成的。当用户在源文件中的给定行和列请求完成时,守护程序将源文件的最后保存版本和当前源文件的缓存翻译单元传递给clang_codeCompleteAt。 (Clang CodeComplete docs)。
传递给clang_parseTranslationUnit(来自CompletionThread::process, line 271)的标志是CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes。传递给clang_codeCompleteAt(来自CompletionThread::process, line 305)的标志是CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns。
对clang_codeCompleteAt 的调用非常慢 - 即使完成位置是合法成员访问代码(文档中提到的预期用例的子集),也需要大约 3-5 秒才能获得完成的clang_codeCompleteAt。根据 IDE 代码完成标准,这似乎太慢了。有没有办法加快速度?
【问题讨论】:
-
我很乐意为您提供帮助,但我们需要更多细节。示例代码将是一个很好的开始
-
平。这个问题有进展吗?
-
@Cameron 很抱歉长时间延迟回复您。我尝试了
CXTranslationUnit_SkipFunctionBodies、CXCodeComplete_IncludeMacros、CXCodeComplete_IncludeCodePatterns的所有 8 种组合,并没有发现我正在使用的代码库有显着差异。所有这些平均每完成大约 4 秒。我想这只是因为 TU 的大小。CXTranslationUnit_PrecompiledPreamble确保reparseTU非常快。然而,即使使用CXTranslationUnit_CacheCompletionResults,clang_codeCompleteAt对我的用例来说也非常缓慢。 -
@Mehrwolf 确认。见上面的评论。
-
嗯,这很不幸。您能否重现对公众可用的翻译单元(例如开源)的完成速度慢?如果我们能够自己复制它会有所帮助。完成应该与重新解析大致一样快,因为这就是它在内部所做的(它注入一个特殊的代码完成令牌并解析到那个点)。
标签: c++ clang llvm code-completion libclang