Eclipse 冻结长文件中的打开声明

Eclipse freeze on opening declaration in long file

我在 linux 上使用 Eclipse CDT。我有一个包含 5k 行代码的长头文件。当我尝试通过按 F3 打开此文件中某些变量的声明时,Eclipse 冻结大约 20 秒,然后打开声明。此问题导致代码导航在长文件中无法使用。在较短的文件中,声明几乎立即打开。

我尝试重新启动 Eclipse 并重建索引,但这没有帮助。
我的 Eclipse 版本是:

Version: Neon.1 (4.6.1)
Build id: Z20161111-1340

我该如何解决这个问题?

由于 CDT 的架构方式,对较大文件的操作将比对较小文件的操作慢。

CDT从两个地方获取Open Declaration等操作代码的语义信息:

  • 对于当前打开的文件:从为该文件构建的 AST(抽象语法树)。
  • 对于项目中包含的 header 文件和其他文件:来自 index,这是一个关于项目的语义信息的可搜索数据库。

索引最初是通过为项目中的每个文件创建一个 AST 并将它们的信息存储到数据库中来构建的。这是一个time-consuming的过程,但是只需要做一次(然后每次保存文件都会增量更新),而且一旦建好,查询索引很快(查询大约是O(log n) 索引的大小).

另一方面,由于 AST 表示当前(可能)正在编辑的代码,因此它会不断被重建 "as you type"。由于构建 AST 的文件长度至少为 O(n)(可能更糟;我没有仔细分析),因此依赖 AST 的操作会变慢您正在编辑的文件的长度增加了。

现在,解决方法:

  1. Preferences | C/C++ | Editor | Scalability 中启用一些 可扩展性设置 可能会有所帮助,通过限制需要为大文件构建 AST 的操作类型(请注意,您需要为 "large" 定义阈值)。我不是很清楚它是否会使公开声明更快;试试看。

  2. 然而,您最好的选择是 将您的 header 分解成更小的 headers。这具有减少编译时间的额外优势(因为并非所有翻译单元都可能需要包含 header 的所有部分),并更好地组织您的代码(最后一个是品味问题;尽管不同意) .

看起来这是 Eclipse bug 455467

冻结原因cpu开启申报时使用率高
我应用了 Comment 5 的解决方法并将冻结时间降至 1-5 秒:

Changing all settings in .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.codan.core.prefs from RUN_AS_YOU_TYPE\=>true to RUN_AS_YOU_TYPE\=>false seems to help us out of this but this is not really what we want.

据我了解,此变通办法会部分禁用 Codan - CDT 静态分析框架。