为什么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打开时间越长编译速度就越慢,我该怎么办? 的相关文章

  • 使用 Delphi 读取 Excel 电子表格

    我需要使用 Delphi 2010 读取和写入 Excel 电子表格 没什么花哨的 只需读取和写入不同工作表上特定单元格和范围的值 需要在没有安装 Excel 的情况下工作并支持 Excel 2007 我看过的一些东西 我尝试过使用ADO
  • 比较两个 numpy 数组的最快方法

    我有两个数组 gt gt gt import numpy as np gt gt gt a np array 2 1 3 3 3 gt gt gt b np array 1 2 3 3 3 无论顺序如何 比较这两个数组的元素是否相等的最快方
  • 似乎有时 Delphi 是区分大小写的 - “覆盖方法应该与祖先的大小写匹配”

    今天我遇到了一个 奇怪 的提示 覆盖方法 xxxx 应匹配祖先 yyyy 的大小写 解决方案是完全按照祖先中的方式声明方法名称 我相信这是自 Delphi Net 编译器以来编译器中保留的东西 与祖先中完全相同的方法声明方法使编译器 沉默
  • TXMLDocument.Active := False 导致 FastMM4 错误消息“FastMM 检测到块在释放后已被修改”

    我们在 FullDebugMode 下使用 Delphi XE8 和 FastMM4 版本 4 992 会产生奇怪的效果 要重现效果 只需创建一个新的 TForm 应用程序 将 FastMM4 放入 DPR 文件的第一行 在表单上放置一个按
  • TFrame继承重构

    我提出的另一个 TFrame IDE 注册组件问题 感谢各位程序员的帮助 尝试 Darrian 的 TFrame 继承建议here https stackoverflow com questions 382562 delphi visual
  • Android Drawable 绘图性能?

    在我看来 我有一个简单的 ARGB 可绘制对象 大约需要 2 毫秒才能绘制 但我可以在 0 5 毫秒内绘制与位图相同的文件 只是一些快速代码 我真的不能认为它是一个选项 优化可绘制对象的绘制速度的最佳方法是什么 这取决于可绘制的数量以及每个
  • 对于大型简单数据库,SQLite 和 DISQLite 有何比较?

    两者有什么区别SQLite http www sqlite org and DISQLite http www yunqa de delphi doku php products sqlite3 index为什么我要选择其中一个而不是另一个
  • 如果 jQuery 脚本是在所有页面 HTML 之后加载的,那么它们还需要 $(document).ready 吗?

    如果我在所有页面 HTML 下方加载 jQuery 脚本 我是否还需要等待 document ready能够使用jQuery来查找页面中的元素 否 因为文档已经加载 Dom 从上到下加载 我个人喜欢把所有的js放在页面底部而不是放在头部 然
  • 为什么乘法比除法便宜?

    我最近编写了一个 Vector 3 类 并将我的 normalize 函数提交给朋友审阅 他说这很好 但我应该尽可能乘以倒数 因为在 CPU 时间上 乘法比除法便宜 我的问题很简单 这是为什么 从硬件可以更轻松地实现的基本运算的角度来考虑
  • 使用 TArray 而不是 Array of T 的原因是什么?

    我正在将遗留的 Delphi 应用程序迁移到 Delphi XE2 我想知道是否有充分的理由替换定义为的数组Array of MyType to TArray
  • 在内连接中重用 mysql 子查询

    我正在尝试优化查询 试图避免重复用 指示的查询 复杂查询 使用两次 结果相同 原始查询 SELECT news FROM news INNER JOIN SELECT myposter FROM SELECT COMPLEX QUERY U
  • IN 运算符对 SQL 查询性能的影响有多大?

    我的 SQL 查询需要 9 个小时才能执行 见下文 Select Field1 Field2 From A Where Field3 IN 45 unique values here 当我将此查询拆分为 3 个完全相同的查询 仅每个 IN
  • 具有单个成员的结构是否具有与成员类型相同的性能?

    Does struct单个成员是否具有与成员类型相同的性能 内存使用和速度 Example 这段代码是一个struct与单个成员 struct my int int value 是的表现my int与 一样int 同意 harper htt
  • CMake:连续编译程序两次

    为了能够进行许多自动优化 我希望能够使用标志编译我的程序 fprofile generate首先 然后运行它生成配置文件 然后使用以下命令重新编译程序 fprofile use反而 这意味着我想连续编译我的程序两次 使用两个不同的CMAKE
  • 索引在 NOT IN 或 <> 子句中起作用吗?

    我读过 至少 Oracle 数据库中的普通索引基本上是 B 树结构 因此存储处理适当根节点的记录 小于 根的记录被迭代地存储在树的左侧部分 而 大于 根的记录被存储在右侧部分 正是这种存储方法有助于通过树遍历实现更快的扫描 因为深度和广度都
  • 在网格上拖动时拖动图像更改

    我正在 StartDrag 上创建自定义 DragObject 的实例 procedure TForm1 GridStartDrag Sender TObject var DragObject TDragObject begin DragO
  • 如何在 AppleScript 的处理程序中有效地构建列表?

    AppleScript 文档建议使用以下代码来有效构建列表 set bigList to set bigListRef to a reference to bigList set numItems to 100000 set t to ti
  • 性能 多次插入或多值单次插入

    从性能角度 时间和服务器负载 来看 最好是进行多个插入或单个插入多个值 我在 stackoverflow 上发现每次插入最多可以有 1000 个值集 我说的是两种情况 要插入大约 1000 3000 个值 有时我会在 mySQL 数据库中插
  • 哪个更快:清除集合或实例化新集合

    我的代码中有一些通用列表 其中有数十或数百个元素 有时我需要用其他对象重新填充此列表 所以问题是 调用什么会更快Clear 方法或创建一个new List
  • 使用 Nexus 10 在 Android 4.3 上滚动时性能不佳

    我的应用程序有一个带有一些滚动的列表视图 在我测试过的所有手机 Nexus One Nexus 4 和 Galaxy S3 4 上都表现得非常好 以 60fps 滚动 但 Nexus 10 上的表现很糟糕 大概在 15fps 左右 我已经将

随机推荐

  • 学习 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 万行 编译速度正在成为一个问题 我们花了时间清除单元循环引用 编译缓慢的已知原因 并检查了设置的各个方面 已经到了我们无法通过我们所能控