Joh*_*ica 14 delphi optimization delphi-xe
我一直在使用Delphi 2007来处理不需要Unicode的项目.
最近我一直在想Delphi XE,因为
我想知道,编译器中是否有任何增强功能使Delphi XE生成比Delphi 2007更快的代码,我说的是:
编辑
在此页面上:http://www.embarcadero.com/products/delphi/whats-new
它列出:Improved compiler performance
那究竟改进了什么?
Arn*_*hez 16
两点,我的两分钱:
1.对于我们的开源ORM框架
当运行单元测试用Delphi 7,2007年德尔福和Delphi 2010和编译器,我发现了德尔福7和Delphi 2007,但不是之间的一些速度提高德尔福2007年至2010年间显着德尔福2010年生成的代码被发现是甚至有点慢点.我手头没有Delphi XE编译器,但我猜它与Delphi 2010有些相同 - 主要是关于泛型的错误修复,AFAIR.
当我编写低级pascal代码并使用分析器时,我在asm视图(Alt-F2)中花了很多时间.所以我通常会注意到Delphi编译器版本之间的区别.
恕我直言,主要的改进确实是inline方法和函数/程序的关键字,可以在Delphi 2007中使用,而不是在Delphi 7中.另一个改进是更积极的寄存器重用.
浮点生成的代码仍然很慢并且有时很糟糕(FWAIT仍然生成,即使不再需要,并且内联浮点代码甚至可能比没有内联更糟糕!
有趣的是我们的框架,所有这些测试都是它使用自己的低级单元处理大量数据,以非常优化的pascal编码以获得最佳性能.和设置在单元测试(超过540万个个体测试)上的实际数据(数值转换或UTF-8文本处理)的工作,有很多不同的方法,包括低级别转换,文本解析,对象分配,多线程和的客户/服务器方向.所以在这里,编译器生成的代码确实有所作为.
代码主要在我们的框架内.我们使用自己的RawUTF8字符串类型,而不是通用字符串.因此,瓶颈不是VCL也不是Windows API,而只是纯粹的Delphi编译代码.实际上,即使对于UTF-8编码或数字转换,我们也避免了大多数API调用.
当然,我尝试使用PUREPASCAL条件集进行此基准测试,即不在asm中运行优化部分,而只依赖于"纯粹的pascal"代码.
2.对于SynLZ压缩单元
另一个关于速度的好实验是编写和分析我们的SynLZ压缩单元.通过LZ压缩算法的这种优化实现,压缩比zip快20倍,解压缩速度快3倍.实际上,它与LZO竞争压缩比和解压缩速度,但是比LZO压缩速度快得多:SynLZ能够以与解压缩速率相同的速率压缩数据.这种对称的实现在压缩世界中非常罕见.
它只涉及整数算术和位逻辑,填充和查找哈希表以及内存复制.
我们编写了一些非常有用的pascal代码,然后用Delphi 7和Delphi 2009编译它.
Delphi 2009生成的代码以明显的方式比Delphi 7更快.生成的代码确实更好,具有更好的寄存器重用.
通过手动调整的汇编器分析,我们实现了更好的性能.例如,6 KB的XML文件在14 MB的压缩/ s,使用ZIP,185 MB/s,使用LZO,184 MB/s,使用SynLZ的德尔福2009年Pascal版本,并与我们的最终调整ASM版本256 MB /秒SynLZ.
结论:
对于涉及整过程中,文本分析和存储代码的生成,我认为德尔福XE比德尔福7快,但应该或多或少在同一水平比2007年德尔福内联是主要的新功能,这可能加快很多代码.
但对于实际应用,速度提升不会明显.在某些特定情况下,大约10%或20%,而不是更多.算法始终是提高性能的关键.Delphi 7已经是一个不错的编译器.
对于浮点运算,Delphi编译器现在已被弃用.我希望64位编译器中的SSE代码会在这里改变结果.
要直接回答您的问题,在Delphi 2010或XE中,没有自动内联或自动循环展开AFAIK.多线程代码中的开销不是编译器的一部分,而是库(FastMM4,引用计数等).所以我不认为Delphi XE比Delphi 2007产生更快的代码.
War*_* P 9
我对Delphi XE编译器的非正式测试表明,在涉及使用泛型的许多情况下代码生成明显更正确,并且在Delphi 2009,2010时代困扰编译器的某些编译器内部故障(错误)现在固定.在许多情况下,在IDE中重复重建时,使用泛型链接到包中的Delphi 2010代码会在编译和链接期间导致损坏的DCP文件输出或神秘的编译器内部错误.
我会写在发行说明中,如果是我,"我们修复了错误".(我收回了"有史以来最好的"这句话,因为似乎人们认为我把它当作我当时雇主的广告,我以前曾在Embarcadero工作过).我想所有这些都已经被平滑化为"性能"这个词,其中性能被理解为"正确性","可靠地完成工作,没有故障".
至于速度,我没有注意到Delphi 2009,2010或XE的性能分析代码在性能与运行时速度方面存在统计上的显着差异,也没有发现编译器在"它更快地构建项目"方面的性能.
由于您询问了Delphi 2007,您应该知道存在巨大的类型更改(String = AnsiString,String = UnicodeString).对于相同的代码,有些东西会变慢,有些东西会更快,而且如果你在2010年重新编译你的代码而不知道很多关于代码的话,那么100%不可能说出会发生什么.如果您之前非常依赖WideString,现在可以使用UnicodeString,那么您的代码将变得更快,因为UnicodeString性能远远优于WideString性能.一些delphi程序在你的代码中花费大量时间(在几乎不可见的情况下)将你的ansi数据转换为unicode数据,内部在win32中,例如当你使用Memo公共控件时.另一方面,过去使用字节大小字符串的一些东西现在将使用字大小的字符串,因此在某些地方内存使用量会增加,而某些操作可能会变慢.对于正确移植的代码,最有可能的最终结果(如果你在2007年编写它们,你必须对大多数应用程序进行一些更改才能使它们在XE中构建),"原始性能"的净减少很小.
但是,Delphi XE在IDE中一遍又一遍地构建项目,更重要的是重建和重建,并且永远不会崩溃.德尔福2007一直在崩溃.Delphi 2007还有数百个恼人的编译器错误,这些错误会让我发疯.编译码速度甚至不是升级的主要原因,可靠性是.
通常在我一直在使用的大型项目中,Delphi 2007,2009和2010会在某些复杂软件包的第二次或第三次重建时崩溃.在2009年和2010年,大量使用泛型的软件包特别容易导致IDE崩溃.XE是稳定的,即使我使用繁重的泛型代码也是如此,这是发布说明可能正在谈论的一种"性能"改进.我称之为"bug修复".让我们直言不讳.
(删除最后一段,因为人们认为这是一则广告)
我没有看到任何证据表明代码生成有任何重大改进.我不知道自Delphi 5以来在代码生成改进方面有一些非常重要的事实.事实上,我从未发现我的代码在升级后运行得更快,并且可以追溯到Delphi 2.
| 归档时间: |
|
| 查看次数: |
3341 次 |
| 最近记录: |