为什么Delphi打开时间越长编译速度就越慢,我该怎么办?

2024-05-04

我的公司十多年来一直在德尔福上运行一个大型项目。我们的代码库多年来一直在增长,目前代码数量约为 400 万行。编译速度正在成为一个问题。我们花了时间清除单元循环引用(编译缓慢的已知原因)并检查了设置的各个方面。已经到了我们无法通过我们所能控制的程度进一步实质性改进的地步。

目前,在运行 Windows XP SP3 和 Delphi 2006 的最先进的 4 核 PC 上,重新启动 Delphi 并进行完整构建,大约需要 40 秒。然后,如果我们立即在同一个 Delphi 会话中进行另一个完整构建,则将需要 1m 40s。再次进行完整的构建,情况会变得更糟。等等等等。

(我们很清楚Windows本身会缓存文件,这对编译速度影响很大。上面的数字是基于文件被缓存的情况。我们设置这样的场景是让Delphi编译一次项目,终止它,然后启动一个新的 Delphi 会话。因此,虽然 40 秒看起来并不慢,但这只是因为 Windows 缓存了文件。我们这样做是为了进行逐个比较。)

让我们困惑的是为什么编译速度会变差。 (我们过去观察到,如果项目有大量单元循环引用,速度会更慢。)如果我们终止 Delphi 并启动一个新会话,编译时间将回到 40 秒。我们观察到的更有趣的事情是,通过单击“取消”按钮中止编译,然后立即进行完整构建,我们可以实现相同的速度“改进”。编译时间也将恢复到 40 秒。

在我们看来,Delphi 自己的单元依赖缓存并不像从头开始构建它那么有效,而且随着时间的推移,它会变得越来越糟。而且“取消”按钮似乎也会以某种方式清除此缓存。我们的想法是,如果我们能够利用Delphi IDE子系统来进行这种清理,我们就可以始终将编译速度保持在峰值性能。但我们不知道怎么做。

有谁知道我们能做什么?

我们仍在使用 Delphi 2006,因为我们还没有找到将我们的大型项目移植到 Unicode 的可行方法。我在论坛上读到,最新的 Delphi XE 也出现了与单元循环引用类似的编译速度问题。有人知道 Delphi XE 是否解决了这个问题吗?

附注我们还意识到,将项目拆分为运行时包可以减少编译时间。但出于部署和管理原因,我们尽量避免使用运行时包。


如果您构建应用程序,可以使用以下一些技巧来加快该过程:

  • 在构建之前删除所有 *.dcu (del *.dcu /s);
  • Run a 好的碎片整理程序 https://web.archive.org/web/20150923174633/http://www.mydefrag.com:80/在您相应的硬盘上;
  • 将大部分源文件放在同一目录中,并尝试使 IDE 和项目库路径尽可能短,首先使用最常用的条目;
  • Install 德尔福加速器 https://www.idefixpack.de/blog/ide-tools/delphispeedup/.

Delphi 2007 的编译速度应该比 Delphi 2006 更快。

Delphi 2009/2010/XE 可能会更慢:从用户实验来看,泛型和新 RTTI 的实现使编译过程更加复杂,并且发现实际实现更慢,例如与 Delphi 2007 相比。

Update:

您是否尝试启用项目ClearUnitCacheItem隐藏菜单项?

我已经通过 CnPack 启用了此条目,或者通过DDev扩展 https://www.idefixpack.de/blog/ide-tools/ddevextensions/(我不知道是哪一个做的,可能是后者)。这可用于清除内部单元缓存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Delphi打开时间越长编译速度就越慢,我该怎么办? 的相关文章

随机推荐

  • 学习 WPF 会提高我的 ASP.NET 技能吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经在 Windows 窗体领域工作了很多年 而且仍然如此 我完全不熟悉 ASP NET 技术 也不熟悉其他 Web 相关技术 我曾合作过 O
  • 使用 Python/PyGObject 在 Windows 中加载 GTK-Glade 翻译

    我有一个 Python 脚本 可以加载可翻译的 Glade GUI 在 Linux 下一切工作正常 但我在理解 Windows 上的必要步骤时遇到了很多困难 Linux 下似乎需要的只是 import locale locale setlo
  • 你如何处理冗余代码?

    我有一个类 它是代码库项目的一部分 该项目是为不再需要的特定目的而编写的 所以问题是你如何处理这样的代码 您是否简单地删除它 或者您是否记住它 未来的开发人员可能会遇到它 但没有意识到他们可以忽略它 或者您是否有某种存档系统 是否存在公认的
  • 捕获通信异常而不是自定义故障异常 - WCF

    在服务器上我抛出这样的异常 catch SqlException exception if exception Message Contains Custom error from stored proc Exception to be t
  • 使用map或reduce或filter,在Scheme中,计算列表中有多少个元素[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 number length 1 1 0 1 0 0 这假设返回 6 我知道如何使用长度并找到它 但我不知道如何在没有长度的情况下使用映射或过
  • List.Except 不起作用

    我尝试减去 2 个列表 如下代码所示 assignUsers已获得 3 条记录assignedUsers有 2 行 后Except方法我仍然得到 3 行 尽管我应该得到 1 条记录 因为 2 行assignedUsers类似于assignU
  • TypeScript 中的可等待类型

    我在 JavaScript 中经常使用 async await 现在我正在逐渐将代码库的某些部分转换为 TypeScript 在某些情况下 我的函数接受将被调用和等待的函数 这意味着它可以返回一个承诺 只是一个同步值 我已经定义了Await
  • 使用来自服务器和 ko.mapping 创建函数的元数据处理任意选项

    我有一个视图模型 其中一些可供选择的属性值由其他属性决定 这是通过requires field var clusterOptions name None sku 0 price 0 name Standard MySQL Cluster s
  • Vue 创建项目 - 找不到模块“vue-loader-v16/package.json”

    我通过命令全局安装了 vue clinpm install g vue cli我尝试通过命令创建新项目vue create examples vue 2一切都很好 直到我跑步npm run serve 这个命令给我一个错误找不到模块 vue
  • Qt Designer 与手动编码

    每次我使用图形工具包开始一个项目时 第一个冲突就会发生在如何处理视觉设计和小部件布局的决定上 图形工具还是手动编码 这是一个非常棘手 主观的问题 因为大多数人会根据个人喜好来决定 它还很大程度上取决于图形工具的质量 在这种情况下 我想只关注
  • Android:如果我将serialVersionUID 添加到旧的可序列化对象中,会发生什么?

    如果您采用从未显式指定过serialVersionUID的旧可序列化对象 并将serialVersionUID添加到该对象 会发生什么情况 在我看来 下次最终用户更新应用程序时 它会尝试反序列化光盘中的数据 发现serialVersionU
  • 可以在 iOS 应用程序中全局禁用旋转吗?

    我有一个由很多视图控制器组成的应用程序 在项目摘要中 我已将纵向方向设置为唯一支持的设备方向 然而 该应用程序在横向旋转时仍然会变得混乱 我的问题是 有没有办法通过应用程序委托或其他方式全局禁用自动旋转 或者我是否必须进入所有视图控制器并添
  • 在单个测试中断言多个条件,还是分成多个测试? [复制]

    这个问题在这里已经有答案了 如果您正在测试如下所示的计数函数 那么在一个函数中测试该函数的多项内容与为每个测试使用一个测试函数相比 是否被认为是 正确 或 错误 function testGetKeywordCount tester thi
  • LINQ 分组依据和选择集合

    我有这个结构 Customer has many Orders has many OrderItems 我想生成一个列表CustomerItems通过 LINQ 给出的子集OrderItems List of new Customer Li
  • 如何使用 jq 对可能不存在的数组进行排序?

    给定以下 JSON alice items foo bar bob items bar foo charlie items foo bar 我可以排序items数组如下 jq lt users json map items sort ite
  • 在 mongodb shell 中打印文档值

    我想在 mongo shell 中打印此 JSON 文档的值 就像简单的控制台输出一样 无需创建新的集合或文档 提前致谢 我找到了一个解决方案 通过使用 forEach 应用 JavaScript 方法 db widget find id
  • 如何使用 nosql 构建成就和徽章

    我目前有一个使用 mongodb 作为数据库的社交游戏应用程序 我的问题是 如果我想创建一个积分和徽章系统 有哪些建议 成就 徽章的业务逻辑可能会变得非常复杂并且非常临时 因此实时授予徽章似乎效率不高 我想象将跟踪的操作添加到队列中的某处
  • Django 项目层次结构/组织

    我是 Django 新手 正在开始一个项目 我想以正确的方式来做 我想知道您认为组织项目的最佳实践是什么 我有一些问题 如何将静态资源与Python代码分离 这样我就不会浪费时间通过Django处理静态内容 由于应用程序是可重用的模块 因此
  • PHP - 如何查看服务器是否支持 TLS 1.0?

    我正在编写一个简单的检查器 您可以在其中输入一个 URL 该检查器将检查输入的 URL 是否使用 TLS 1 0 1 1 或 1 2 本质上 我想显示一条消息 Yoursite com 正在使用 TLS 1 0 建议禁用此功能 问题是 只有
  • 为什么Delphi打开时间越长编译速度就越慢,我该怎么办?

    我的公司十多年来一直在德尔福上运行一个大型项目 我们的代码库多年来一直在增长 目前代码数量约为 400 万行 编译速度正在成为一个问题 我们花了时间清除单元循环引用 编译缓慢的已知原因 并检查了设置的各个方面 已经到了我们无法通过我们所能控