对于不需要 Unicode 的项目,我主要使用 Delphi 2007。
最近我一直想知道 Delphi XE 因为
不过,我想知道,编译器中是否有任何增强功能可以使 Delphi XE 生成比 Delphi 2007 更快的代码,我说的是这样的事情:
编辑
本页: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/