我的两个观点:
1. 关于我们的开源ORM框架
在使用Delphi 7、Delphi 2007和Delphi 2010编译器运行我们的单元测试时,我发现Delphi 2007比Delphi 7有一些速度改进,但Delphi 2007和2010之间没有明显差异。发现Delphi 2010生成的代码甚至有点慢。我手头没有Delphi XE编译器,但我猜它与Delphi 2010差不多-主要是关于泛型的错误修复,如果我没记错的话。
当我编写低级Pascal代码并使用分析器时,我会花费很多时间在asm视图(Alt-F2)中。因此,我通常会注意到Delphi编译器版本之间的差异。
我认为主要的改进确实是方法和函数/过程的inline
关键字,在Delphi 2007中可用而在Delphi 7中不可用。另一个改进是更积极的寄存器重用。
浮点数生成的代码仍然很慢,有时很糟糕(即使不再需要FWAIT,也仍然会产生,内联浮点代码甚至可能比不内联还要糟糕!
我们的框架和所有这些测试有趣之处在于它处理了大量数据,使用自己编写的低级单元,在非常调整的Pascal中进行编码以获得最佳性能。提供的单元测试(超过5,400,000个单独的测试)在真实数据上工作(数字转换或UTF-8文本处理),包括低级转换、文本解析、对象分配、多线程和客户端/服务器方向等各种各样的进程。因此,在这里,编译器生成的代码确实有所不同。
代码主要在我们的框架内部。我们使用我们自己的RawUTF8字符串类型,而不是通用字符串。因此,瓶颈不在VCL也不在Windows API,而仅在纯Delphi编译代码中。实际上,我们避免了大多数API调用,甚至对于UTF-8编码或数字转换也是如此。
当然,我尝试了设置PUREPASCAL条件的基准测试,即不运行asm中的优化部分,而是仅依赖于“纯Pascal”代码。
另一个关于速度的好实验是编写和分析我们的
SynLZ压缩单元。通过这种LZ压缩算法的优化实现,压缩速度比zip快20倍,解压速度比zip快3倍。实际上,它与LZO竞争压缩比和解压速度,但在压缩方面比LZO快得多:SynLZ能够以与解压缩相同的速度压缩数据。这样对称的实现在压缩领域非常罕见。
这涉及到整数算术和位逻辑、哈希表中的填充和查找以及内存复制。
我们编写了一些经过优化的Pascal代码,然后使用Delphi 7和Delphi 2009进行编译。
Delphi 2009生成的代码比Delphi 7更快,而且明显地更好,寄存器重用效果更好。
通过手动调整汇编代码,我们实现了更好的性能。例如,使用zip压缩6 KB的XML文件时,速度为14 MB/s,使用LZO为185 MB/s,使用SynLZ的Delphi 2009 Pascal版本为184 MB/s,使用我们最终调整的asm版本的SynLZ为256 MB/s。
结论:
对于涉及整数处理、文本解析或内存的代码生成,我认为Delphi XE比Delphi 7更快,但应该与Delphi 2007差不多。内联是主要的新特性,可以大大加速代码。
但对于真实应用程序,速度增加不会很明显。在某些特定情况下可能会增加10或20%,但不会更多。算法始终是提高性能的关键。Delphi 7已经是一个很好的编译器。
对于浮点运算,Delphi编译器现在已经过时。我希望64位编译器中的SSE代码会改变这里的结果。
直接回答你的问题,在Delphi 2010或XE中,没有自动内联或自动循环展开,据我所知。而多线程代码中的开销不是编译器的一部分,而是在库(FastMM4,引用计数等)中。因此,我认为Delphi XE并不比Delphi 2007产生更快的代码。
gold
版本作为CUDA代码的基准测试。很抱歉那里没有太多的Unicode :-)。不过你提出了一个很好的观点,我一直认为ansistring更快,因为它使用的内存较少,但是忘记了翻译问题。 - Johan