Delphi代码自动完成的性能

28

我有几个大型(约600k行代码)的Delphi项目。其中包括我们团队开发的一些自定义组件。

通常情况下,当我使用ctrl+空格或按“ . ”调用代码完成时,IDE会锁定并长时间思考。有时延迟可能达到一分钟甚至更长时间。其他时候,它会立即弹出建议。

什么因素影响Delphi中智能感知的性能?我是否可以改善这种性能?

目前为止,我最好的解决方案是关闭自动完成,并在需要安静冥想一分钟左右时使用ctrl+空格。

值得一提的是,VS2005、VS2008和XCode似乎都能够给出几乎即时的智能感知反馈(尽管我从未在这么大的项目上尝试过)。

作为一种替代方案,我提供了这个建议


这个非常吸引我。我记得几年前“.”或者“Ctrl+Space”操作都能够完美地运行。我想是在Delphi 7,肯定也包括Delphi 5,那时候几乎感受不到延迟,我非常喜欢它。但是后来D2005发布了,我就遇到了使用这个特性时的种种问题。到底是什么改变了?他们为什么要改变呢? - Peter Perháč
2
好问题。在大型项目上,它对我来说几乎无法使用 - 我不情愿地关闭了它,这很遗憾,因为在线帮助也很麻烦和分散注意力 - 说实话,通常更快/更直接的方法是通过谷歌寻求帮助。我很想再次使用Ctrl-Space,它非常有用。 - robsoft
6个回答

14

Delphi Code Insight 会调用编译器 dll 在用户请求 Code Insight (Ctrl+Space, '.', 等) 时进行自定义编译。此自定义编译将在单元中进行构建,并跳过代码生成、链接等步骤,直到达到文件缓冲区中的当前偏移量。因此,编译器在到达当前位置之前看到的单元列表将对确定 Code Insight 操作的速度起到很大作用。可能存在一个或多个导致繁重的文件系统依赖关系的单元。重新排序 uses 子句、将 uses 子句重构为多个文件或删除 uses 子句中不必要的单元以使当前单元能够编译可能会改善性能。此外,使用包或缩短单元搜索路径可能会提高 CI 响应时间。


1
有趣的回答,谢谢!这里有一些值得思考的东西。 :-) - robsoft
1
确实很有趣...但我必须指出,使用我们著名的快速编译器进行完整应用程序的构建需要约1分钟...而且我曾经遇到过代码完成所需时间更长的情况。 - JosephStyons
如果进行完整的重建(生成.dcu文件到磁盘),是否有助于CI的性能?另外,你使用包还是单体.exe文件? - Adam Markowitz
单体EXE,完整的构建似乎并没有太大帮助。 - JosephStyons

7

请务必在dpr中明确包含项目使用的所有单位(*)。


不要依赖搜索路径来查找从另一个单位调用的单位,请将其添加到dpr中。虽然dpr会变得更长,但所有与编译相关的事情都会更快,包括代码洞察。

(*) 不是已安装组件的单位。


这实际上似乎有很大帮助... ctrl+f12会弹出一个不太美观的单元列表,这些单元并不特定于该项目...但我可以接受。 - JosephStyons
1
除了项目内的搜索路径之外,如果您有一个巨大的库路径,其他可怕的滞后也会出现。 - Warren P
在类似的情况下,对我有很大帮助的是从“uses”部分中删除未使用的单元,并尽可能将单元从“interface”移动到“implementation”。346kLoc项目编译时间从70秒降至8.8秒。这直接影响了代码完成。现在几乎是瞬间完成的。 - Kromster

4

我不知道你使用的是哪个版本,但是Delphi 2009中更快的代码自动完成功能是我最喜欢的功能之一。


很好知道。我目前正在使用d2007。 - JosephStyons

3

这是Delphi长期存在的问题,我不得不关闭自动完成功能。在这种方式下工作了一段时间后,我非常满意。即使只需要花费一小部分时间,IDE 使我的打字变慢令人不安,并且会打断我的思路。关闭自动完成功能更好,我的看法是如此。


不能同意不使用“自动化”的观点... - Peter Perháč
1
MasterPeter:每个人都有自己的方式。当我知道我想要什么时,打字速度会更快,而不是停下来再选择。当我不知道我想要什么时,我肯定知道,并且完全能够打Ctrl+Space来获取帮助。 - dwc
在小型项目中,我发现它非常出色;一旦我学会了如何使用代码模板和自动完成功能,我就可以充分利用它们。但是,在大型项目中,由于性能不佳,这使得情况变得更加令人沮丧。 - JosephStyons

2

我刚遇到了这个问题,通过从我的环境库路径中移除一个无效的网络链接来解决它。现在我的问题已经完全解决了。


0
你是否将团队自定义组件的源目录包含在库路径中?如果只有组件 DCU 文件在库路径中,而没有源文件,那么速度差异会很有趣。

是的,自定义组件的源路径已经存在。我会尝试使用仅限dcu的方法。 - JosephStyons
我尝试了仅使用DCU路径,但似乎并没有改变智能感知的性能。 - JosephStyons

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