当前位置: 首页 > 知识库问答 >
问题:

使用 clang 更快地完成代码

秦弘亮
2023-03-14

我在使用clang的代码完成机制时正在研究潜在的代码完成加速。下面描述的流程是我在Anders Bakken的rtages中发现的。

翻译单元由守护程序监控文件解析以查找更改。这是通过调用clang_parseTranslationUnit和相关函数(重置*处置*)完成的。当用户在源文件中的给定行和列处请求完成时,守护程序将源文件的最后保存版本和当前源文件的缓存翻译单元传递到clang_codeCompleteAt。(Clang Code完整文档)。

传递给clang_parseTranslationUnit(来自CompletionThread::进程,第271行)的标志是CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes。传递给clang_codeCompleteAt(来自CompletionThread::进程,第305行)的标志是CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns

对< code > clang _ codecomplete at 的调用非常慢,即使在完成位置是合法成员访问代码的情况下,也需要大约3-5秒才能完成,这是< code > clang _ codecomplete at 文档中提到的预期用例的子集。按照IDE代码完成标准,这似乎太慢了。有没有加速的方法

共有2个答案

詹高畅
2023-03-14

有时,这种程度的延迟是由于网络资源(文件搜索路径或套接字上的NFS或CIFS共享)超时造成的。通过在运行的进程前面加上strace-Tf-o trace.out,尝试监视每个系统调用完成所需的时间。查看<code>跟踪中尖括号中的数字。out</code>表示需要很长时间才能完成的系统调用。

您还可以监视系统调用之间的时间,以查看哪个文件的处理需要太长时间才能完成。为此,请在您运行的进程前加上strace-rf-otrace.out。查看每个系统调用前的数字,以查找较长的系统调用间隔。从那时开始向后查找调用,以查看正在处理的文件是哪个。

如果这没有帮助,您可以分析您的流程,看看它在哪里花费了大部分时间。

酆恩
2023-03-14

clang_parseTranslationUnit的问题是预编译的序码在第二次称为代码完成时不会重用。计算预编译前导码花费的时间超过 90%,因此您应该允许尽快重用预编译前导码。

默认情况下,它第三次被调用以解析/重分析翻译单元。

查看ASTUnit.cpp中的变量“PreambleRebuildCounter”。

另一个问题是此前导码保存在临时文件中。您可以将预编译的前导码保留在内存中,而不是临时文件中。它会更快。:)

 类似资料:
  • 本文向大家介绍如何使用JavaScript集更快地编写代码?,包括了如何使用JavaScript集更快地编写代码?的使用技巧和注意事项,需要的朋友参考一下 要了解如何使用集合使代码更快,我们必须首先了解必须使用集合而不是数组的场景- 由于Set仅包含唯一元素,因此如果我们事先知道我们希望避免将重复数据保存到我们的结构中会更容易。 设置像的基本操作,,,等...很容易实现的有效基础上,原生内置业务提

  • ​clang-format 是个自动格式化 C/C++/Objective-C 代码的工具, 可以让开发人员不需要担心代码审查期间的样式问题. 强烈建议在打开请求之前格式化已更改的C ++代码,这将节省您和审阅者的时间。 你可以通过 npm install -g clang-format 安装 clang-format 和 git-clang-format. 根据 Electron C++ 代码样

  • 叮当 是自动检查 C/C++/Objective-C 代码的样式冲突、编程 错误和最佳实践的工具。 Electron's clang-tidy integration is provided as a linter script which can be run with npm run lint:clang-tidy. While clang-tidy checks your on-disk f

  • 我需要一个示例代码来学习如何从clang::ASTContext生成C代码。 我用c代码创建了ast,并在AST中做了一些更改,现在我想再次生成代码。

  • 按照来自主要clang静态分析器网页(http://clang-analyzer.llvm.org/scan-build.html)的说明… 我有一个小的C文件,它的错误非常多(): 为了了解clang静态分析器(scan-build)是如何工作的,我运行了: 它输出: 好的,太好了,叮当给出了一点警告,但仍然产生了a.out。为什么它不产生报告?对于任何静态分析器来说,单位化变量 都应该是一个显

  • 问题内容: 如何快速执行Firebase的完成侦听器?它说文档中有SetValue和UpdateValue的完成列表,但没有示例。 问题答案: setValue的完成在{}块(关闭)中处理。因此,一旦尝试设置setValue,该块中的代码就会执行。如果没有错误,错误将为nil,快照将是已写入的数据。 给出结果 并打印“完成”