Pra*_*han 108 c++ llvm clang code-completion libclang
我正在研究使用clang的代码完成机制时潜在的代码完成速度.下面描述的流程是我在rtags中发现的Anders Bakken.
翻译单元由守护程序监视文件进行解析以进行更改.这是通过被调用的clang_parseTranslationUnit和相关的函数(reparse*,dispose*)来完成的.当用户在源文件中的给定行和列请求完成时,守护程序将缓存的转换单元传递给源文件的最后保存版本和当前源文件clang_codeCompleteAt.(Clang CodeComplete docs).
传递给clang_parseTranslationUnit(来自CompletionThread :: process,第271行)的标志是CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes.传递给clang_codeCompleteAt(来自CompletionThread :: process,第305行)的标志是CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns.
调用clang_codeCompleteAt非常慢 - 即使在完成位置是合法成员访问代码的情况下,也需要大约3-5秒来获得完成,这是文档中提到的预期用例的子集clang_codeCompleteAt.IDE代码完成标准似乎太慢了.有没有办法加速这个?
clang_parseTranslationUnit存在的问题是第二次被称为代码完成时不会重用预编译的前导码.计算预编译前导码需要超过这些时间的90%,因此您应该允许尽可能快地重用预编译的前导码.
默认情况下,第三次调用解析/重新分析翻译单元时会重复使用它.
看一下ASTUnit.cpp中的这个变量'PreambleRebuildCounter'.
其他问题是此前导码保存在临时文件中.您可以将预编译的前导码保留在内存中而不是临时文件中.它会更快.:)
有时,这种程度的延迟是由于网络资源(文件搜索路径或套接字上的 NFS 或 CIFS 共享)超时造成的。尝试通过在运行的进程前加上 前缀来监控每个系统调用完成所需的时间strace -Tf -o trace.out。查看尖括号中的数字,trace.out了解需要很长时间才能完成的系统调用。
您还可以监视系统调用之间的时间,以查看哪些文件处理需要很长时间才能完成。为此,请在运行的进程前加上strace -rf -o trace.out. 查看每个系统调用之前的数字以查找较长的系统调用间隔。从该点向后查找open调用以查看正在处理的文件。
如果这没有帮助,您可以分析您的流程,看看它大部分时间都花在哪里。
| 归档时间: |
|
| 查看次数: |
4637 次 |
| 最近记录: |