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

Joh*_*ica 14 delphi optimization delphi-xe

我一直在使用Delphi 2007来处理不需要Unicode的项目.

最近我一直在想Delphi XE,因为

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

我想知道,编译器中是否有任何增强功能使Delphi XE生成比Delphi 2007更快的代码,我说的是:

  • 更好地消除死代码(delphi 2007是不错的,但不会消除100%的死代码)
  • 循环展开(ala C的O3优化级别)
  • 自动内联短程序
  • 多线程代码中的开销较少.

编辑

在此页面上: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修复".让我们直言不讳.

(删除最后一段,因为人们认为这是一则广告)

  • "我会在发行说明中写下有史以来最坚固,最可靠,经过良好测试的编译器版本":只是告诉客户以前的版本"嘿,我们一直在开玩笑"? (2认同)
  • 我将在我的帖子中说明这些从属关系,将来,我会冒任何关于我的雇主出售的产品的优点的积极或消极的意见.如果您购买或不购买我没有额外的钱,我不在RAD团队,我在其他产品上工作.我也是Delphi用户,如果我在Embarcadero工作,我会成为PRO DELPHI.如果我没有受到Embarcadero的聘用,我会更加强烈地表达我的意见,因为那时候,我不必对"严谨"的人这么礼貌. (2认同)

Dav*_*nan 5

我没有看到任何证据表明代码生成有任何重大改进.我不知道自Delphi 5以来在代码生成改进方面有一些非常重要的事实.事实上,我从未发现我的代码在升级后运行得更快,并且可以追溯到Delphi 2.

  • 尽管代码生成基本不变,但Delphi的新版本要好得多. (2认同)