为什么在Emacs中使用CEDET进行代码完成的速度如此之慢?

时间:2011-10-12 07:57:17

标签: c++ emacs cedet

我最近尝试过KDevelop。它比semantic-complete-self-insertM-Ret更快(立即)查找符号(变量,函数名,类,结构...)。使用M-Ret速度更快,但它没有像其他IDE一样好的格式,而是像From nil >这样无意义的格式。在emacs中,我必须等待至少~1秒,在许多情况下,等待CEDET查找所有包含的相关源文件,这需要很长时间。

我使用auto complete clang,但它似乎没有速度提升。为什么会这样:(?我喜欢Emacs和所有,并且在我发现KDevelop之前已经将它用于我的C / C ++近一年,但使用Emacs意味着代码完成应该是微不足道的并且是可选的?

1 个答案:

答案 0 :(得分:6)

这个最简单的答案可能就是KDevelop的DUChain和解析器是用(我推测)C ++编写的,其中令牌管理类似地构建。 CEDET的解析器都在Emacs Lisp中,数据库和查找也在Emacs Lisp中。虽然在Emacs中对完成引擎的调用之间构建并缓存了一些表,但是在代码更改时(由于键入),它们经常被重建。一旦构建了所有表,CEDET完成引擎就会非常快。

我在代码完成时运行了许多配置文件运行以使事情变得更快,在阅读了一些关于duchain之后,看起来KDevelop有一个用于整个项目的主符号表。 CEDET无法执行此操作,因为并非所有文件都在项目中,因此每个文件都需要创建一个临时表。我已经了解了很长一段时间,但从未将CEDET的符号数据库外部化,以便可以在单独的线程(进程)中构建和维护这些表。