更快的代码完成与铛
我正在研究可能的代码完成加速,同时使用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_SkipFunctionBodes
是CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes
。 传递给clang_codeCompleteAt
(从CompletionThread :: process,305行 )的CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns
是CXCodeComplete_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
电话,看看哪个是正在处理的文件。
如果这没有帮助,你可以分析你的过程,看看它花费了大部分时间。