使用 clang 更快地完成代码
Faster code-completion with clang
我正在研究在使用 clang 的代码完成机制时潜在的代码完成加速。下面描述的流程是我在 Rtag 中找到的,由 Anders Bakken 撰写。
转换单元由监视文件的守护程序解析更改。这是通过调用clang_parseTranslationUnit
和相关函数(reparse*
,dispose*
)来完成的。当用户请求完成源文件中给定的行和列时,守护程序会将上次保存的源文件版本和当前源文件的缓存翻译单元传递给clang_codeCompleteAt
。(叮当代码完整文档)。
传递给clang_parseTranslationUnit
的标志(来自 CompletionThread::p rocess,第 271 行)CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes
。传递给clang_codeCompleteAt
的标志(来自 CompletionThread::p rocess,第 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
调用以查看哪个是正在处理的文件。
如果这没有帮助,您可以分析您的流程以查看它花费了大部分时间。
- GCC 和 Clang 代码性能的巨大差异
- Clang 给了我符号更改的警告,但代码仍然产生正确的输出
- 获取 clang++:错误:在编译文件系统库的代码时
- 与clang++一起使用的VS代码在构建良好的C++文件中显示错误
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- Clang拒绝类模板的嵌套类仅通过专门化定义的代码是正确的吗
- Qt创建者-如何删除Clang代码模型
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 聚合初始化,clang想让我破坏代码吗
- 使用 Android NDK 使用 clang++ 编译C++代码时对"_Unwind_Resume"的未定义引用
- 为什么clang仍然需要libgcc.a来编译我的代码
- 为什么这段代码无法使用 gcc 4.8.5 编译,而使用 clang 编译正常
- 为什么我在以下代码中收到 clang 错误?
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- clang:错误:链接器命令失败,C++代码中的退出代码为 1(使用 -v 查看调用)
- C++汇编代码分析(使用 clang 编译)
- Clang vs GCC:挥发性访问的不同代码
- 为什么以下代码不使用GCC编译,而是用Clang编译罚款
- LLVM Clang C 代码注入