更快的代码完成与铛

我正在研究可能的代码完成加速,同时使用clang的代码完成机制。 下面描述的stream程是我在rtags中find的,由Anders Bakken发现的。

翻译单元由守护程序监视文件进行分析以进行更改。 这是通过调用clang_parseTranslationUnit和相关函数( clang_parseTranslationUnit reparse*dispose* )完成的。 当用户请求在源文件的给定行和列处完成时,守护进程将源文件的最后保存版本和当前源文件的高速caching翻译单元传递给clang_codeCompleteAt 。 ( 锵CodeComplete文档 )。

传递给clang_parseTranslationUnit (从CompletionThread :: process,第271行 )的CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodesCXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes 。 传递给clang_codeCompleteAt (从CompletionThread :: process,305行 )的CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatternsCXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns

clang_codeCompleteAt的调用非常慢 – 即使在完成位置是合法的成员访问代码( clang_codeCompleteAt文档中提到的预期用例的一个子集)的情况下,也需要大约3-5秒才能获得完成。 IDE代码完成标准看起来太慢了。 有没有办法加快速度?

clang_parseTranslationUnit具有的问题是预编译的前导码在第二次被称为代码完成时不被重用。 计算预编译的前导码占用了这些时间的90%以上,因此您应该允许预编译的前导码尽快重新使用。

默认情况下,第三次被调用来parsing/重新分析翻译单元。

看一下ASTUnit.cpp中的这个variables'PreambleRebuildCounter'。

其他问题是,这个序言保存在一个临时文件。 您可以保留预编译的前导码而不是临时文件。 这会更快。 🙂

有时这种大小的延迟是由于networking资源(文件searchpath或套接字上的NFS或CIFS共享)超时导致的。 尝试监视每个系统调用完成所需的时间,方法是使用strace -Tf -o trace.out前缀运行进程。 查看trace.out中尖括号中需要很长时间才能完成的系统调用的数字。

您还可以监视系统调用之间的时间以查看文件的哪个处理需要很长时间才能完成。 为此,请使用strace -rf -o trace.out 。 查看每个系统调用之前的编号以查找较长的系统调用间隔。 从这一点开始寻找open电话,看看哪个是正在处理的文件。

如果这没有帮助,你可以分析你的过程,看看它花费了大部分时间。