CEDET可扩展性技巧

18

我使用最新的CVS版本 CEDET 来处理几个中等规模的项目(每个项目都有几百 kLOCs,大多数是 C,但也包括一些C++),有时会出现长时间的暂停,在这段时间内系统会完全失去响应好几秒钟。更少见的是,它会完全失控,我不得不按下C-g并尝试移动光标或切换到其他缓冲区以重新获得控制。

我使用 GNU Global 为我所使用的项目创建标签,但这仍然有时非常缓慢,特别是对于semantic-symref-symbol和某些跳转似乎需要解析大量头文件和源文件。在某些情况下,semantic-ia-fast-jump会出现错误信息:semantic-ia--fast-jump-helper: Tag SomeFunction has no buffer information即使在同一项目中,gtags-find-tag立即找到了它(可能在一个过时的位置),虽然这可能是一个临时性的错误,通常semantic-ia-fast-jump是可靠的。

我希望能够得到以下方面的建议:

  • 降低CEDET的速度而又不失去所有语义分析功能。
  • 查找导致CEDET失控的原因,以便我可以修复我的项目定义或提交错误报告。
  • 确定为什么某些语义分析失败。
  • 让semantic缓存更多信息以使其更加响应,我有很多内存可以使用。
  • 管理GNU Global(创建和保持最新状态)以用于不同位置的多个项目,包括系统目录。
  • 管理我使用ede-cpp-root-project配置的项目之间的依赖关系。
  • 管理具有多个构建配置的项目,每个配置都有自己的"config.h"和构建目录。

这篇文章http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html中提供了一些提示,我正在寻找除该文章之外的其他任何内容。

1个回答

20
你使用的CEDET工具受到Emacs跟踪整个项目中每个符号的能力的限制。通过semanticdb-find-default-throttle可以开始限制CEDET/Semantic的操作。如果你知道项目的组织方式,可以禁用某些类型的搜索以加快速度。
CEDET将解析它认为你可能需要的许多文件,这将占用内存。在这种情况下,你可以自定义semantic-idle-scheduler-max-buffer-size来禁用解析大文件,semantic-idle-work-parse-neighboring-files-flag禁用解析随机附近的文件,和semantic-idle-work-update-headers-flag禁用解析头文件。注意,最后2个默认为nil,但是某些自动设置函数启用它们。
CEDET/Semantic将在内存中缓存许多数据,并建立排序的搜索表来提高性能。如果你发现经常编辑头文件,则这些编辑会使缓存过时并强制重新构建。如果你频繁退出和重新启动Emacs,则会强制Semantic重新加载大型数据库表。
另一种可能性是将semanticdb-persistent-path设置为仅列出你非常关心的目录。这将减少保存的数据,不会重新加载。如果需要,它会根据需要重新解析,但它会帮助保持总体数据量较小。
你还可以使用semantic--before-fetch-tags-hook来设置一个函数,在各种条件下返回nil。找到由于大小,网络延迟或其他原因需要长时间解析的文件,并将它们设置为永不解析。那也会节省一些时间。
使用GNU Global是加快速度的好方法。与语义symref一起使用它会导致它找到命中的文件进行解析以提供所需的输出显示数据。对此没有太多的控制。

对于您在上面找到的错误,如果您能够确定一种方法来重现它,请在 cedet-devel 邮件列表中共享它,以便修复该错误。这种类型的错误以前出现过,通常是 GNU Global 标记无法转换为缓冲区标记时。

要调试 CEDET 的死循环,请使用 semantic-debug-idle-functionsemantic-debug-idle-work-function 来缩小范围。有关一些配置信息,请参见上文。

您可以使用 cedet-gnu-global-create/update-database 来更新数据库,或将其添加到钩子中。我认为这还没有包含在文档中。

项目管理很棘手。大多数内置项目适用于小型项目。特别是具有自定义构建系统的大型项目通常需要定制 EDE 项目类型。创建新项目并不难。如果您查看 ede-linux 或 ede-emacs,您可以了解基础知识。在自定义项目中,您可以包装所有相关项目,并覆盖功能,例如宏、包含目录和编译命令。我也不得不为我的工作编写一个自定义项目。它非常类似于 ede-linux,并带有适合我工作场所的独特功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接