delphi - Delphi XE 生成的代码是否比 Delphi 2007 更快?

标签 delphi optimization delphi-xe

对于不需要 Unicode 的项目,我主要使用 Delphi 2007。

最近我一直想知道 Delphi XE 因为

  • 每个人都在赞美它;
  • 内置 SVN 支持

  • 不过,我想知道,编译器中是否有任何增强功能可以使 Delphi XE 生成比 Delphi 2007 更快的代码,我说的是这样的事情:
  • 更好地消除死代码(delphi 2007 不错,但不能消除 100% 的死代码)
  • 循环展开(ala C 的 O3 优化级别)
  • 自动内联短例程
  • 减少多线程代码的开销。

  • 编辑

    本页:http://www.embarcadero.com/products/delphi/whats-new

    它列出了:Improved compiler performance那么具体有哪些改进呢?

    最佳答案

    两点,我的两分钱:

    1. 对于我们的开源 ORM 框架

    运行时 our unit tests使用 Delphi 7、Delphi 2007 和 Delphi 2010 编译器,我发现 Delphi 7 和 Delphi 2007 之间的速度有所提高,但在 Delphi 2007 和 2010 之间并不明显。发现 Delphi 2010 生成的代码更慢。我手头没有 Delphi XE 编译器,但我想它与 Delphi 2010 有点相同 - 主要是关于泛型的错误修复,AFAIR。

    当我编写低级 pascal 代码并使用分析器时,我花了很多时间在 asm View (Alt-F2) 中。所以我通常会注意到 Delphi 编译器版本之间的差异。

    恕我直言,主要改进确实是inline方法和函数/过程的关键字,在 Delphi 2007 中可用,在 Delphi 7 中不可用。另一个改进是更积极的寄存器重用。

    浮点生成的代码仍然很慢,有时很糟糕(即使不再需要,仍然会生成 FWAIT,并且内联浮点代码甚至可能是 worse than with no inlining !

    我们的框架以及所有这些测试的有趣之处在于,它确实使用自己的低级单元处理了大量数据,并以非常调优的 pascal 编码以获得最佳性能。并且提供的单元测试(超过 5,400,000 个单独测试)适用于真实数据(数值转换或 UTF-8 文本处理),具有许多不同的过程,包括低级转换、文本解析、对象分配、多线程和客户端/服务器方向。所以在这里,编译器生成的代码确实有所不同。

    代码主要在我们的框架内。我们使用我们自己的 RawUTF8 字符串类型,而不是通用字符串。因此,瓶颈不在于VCL,也不在于Windows API,而在于纯粹的Delphi 编译代码。事实上,我们避免了大多数 API 调用,即使是 UTF-8 编码或数字转换也是如此。

    当然,我用 PUREPASCAL 条件集尝试了这个基准测试,即不在 asm 中运行优化部分,而只依赖“纯 pascal”代码。

    2. SynLZ压缩单元

    关于速度的另一个很好的实验是编写和分析我们的 SynLZ compression unit .通过这种优化的 LZ 压缩算法实现,压缩比 zip 快 20 倍,解压快 3 倍。事实上,它在压缩率和解压速度方面与 LZO 竞争,但在压缩方面比 LZO 快得多:SynLZ 能够以与解压数据相同的速率压缩数据。这种对称的实现在压缩领域非常罕见。

    它只涉及整数算术和位逻辑、哈希表中的填充和查找以及内存复制。

    我们编写了一些经过调整的 pascal 代码,然后使用 Delphi 7 和 Delphi 2009 对其进行编译。

    以明显的方式,Delphi 2009 生成的代码比 Delphi 7 快。生成的代码确实更好,具有更好的寄存器重用。

    通过手动调整的汇编程序分析,我们实现了更好的性能。例如,一个 6 KB XML 文件使用 zip 压缩为 14 MB/s,使用 LZO 压缩为 185 MB/s,使用 Delphi 2009 pascal 版本的 SynLZ 压缩为 184 MB/s,使用我们最终调整的 asm 版本的 SynLZ 压缩为 256 MB/s同步。

    结论:

    对于涉及整数处理、文本解析或内存的代码生成,我认为Delphi XE比Delphi 7快,但应该或多或少与Delphi 2007处于同一水平。内联是主要的新功能,可以加快一个很多代码。

    但对于实际应用,速度提升不会很明显。在某些特定情况下约为 10% 或 20%,而不是更多。算法始终是获得更好性能的关键。 Delphi 7 已经是一个不错的编译器。

    对于浮点运算,Delphi 编译器现在已被弃用。我希望 64 位编译器中的 SSE 代码会改变这里的结果。

    直接回答您的问题,在 Delphi 2010 或 XE 中,没有自动内联或自动循环展开,AFAIK。多线程代码中的开销不是编译器的一部分,而是库(FastMM4、引用计数等)的一部分。所以我不认为 Delphi XE 生成的代码比 Delphi 2007 更快。

    关于delphi - Delphi XE 生成的代码是否比 Delphi 2007 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6372017/

    相关文章:

    德尔福XE : Lost Library path

    sqlite - Firedac Sqlite 查询在查询编辑器中运行,但在从代码调用时不运行

    delphi - 我如何知道 Delphi IDE 对象检查器位于哪个监视器上?

    android - 使用 C++ Builder Bridge 文件时出错

    c - write() 还是 printf() 更好?

    Delphi XE - 调用 Crystal Reports

    delphi - 如何从资源管理器启动 RAD Studio 的新实例

    php - Delphi DEC库(Rijndael)加密

    .net - 为什么 LINQ to objects 中的 Skip() 没有优化?

    使用左连接的 MySQL 非常慢的查询