delphi - 如何在Delphi中使用现代CPU指令? (Java比Delphi快?)

标签 delphi delphi-xe2 delphi-2010

一位 friend 给我发送了最新版本的 Delphi 和 Java 之间的比较(如果需要,可以提供源代码)。不管你相信与否(最好相信它)Java 现在比 Delphi 快得多,因为 Delphi 编译器不会利用现代 CPU 指令!对于“慢”Java 来说是一个重大突破。

我的问题是:我们如何在 Delphi 中使用现代 CPU 指令而不诉诸 ASM?

FastCode该项目是对上述问题的部分答案,但现在已被放弃。还有其他类似FastCode的项目吗?

这是另一篇文章,表明Java 和 C# 确实比 Delphi 快得多: http://webandlife.blogspot.com/2011/12/c-performance-vs-delphi-performance.html

<小时/>

JAVA

import java.util.Date;

public class j
{
  public static void xxx(int n, int m)
  {
        double t;
        int i, j;
        double d, r;
        t = 0.0;
        for (j = 1; j <= n; j++)
        {
          t = t / 1000.0;
          for (i = 1; i <= m; i++)
          {
                t = t + i / 999999.0;
                d = t * t + i;
                r = (t + d) / (200000.0 * (i + 1));
                t = t - r;
          }
        }
        System.out.println(t);
  }

  public static void main(String [] args)
  {
        Date t1, t2;

        t1 = new Date();
        xxx(1, 999999999);
        t2 = new Date();
        System.out.println((t2.getTime() - t1.getTime())/1000);
        t1 = new Date();
        xxx(1, 999999999);
        t2 = new Date();
        System.out.println((t2.getTime() - t1.getTime())/1000);
  }
}

25秒

德尔菲

program d;
{$APPTYPE CONSOLE}
uses
  System.SysUtils, System.DateUtils;
var
  t1, t2: TDateTime;

procedure xxx (n: integer; m: integer);
var
  t: double;
  i, j: integer;
  d, r: double;
begin
  t:= 0.0;
  for j:= 1 to n do
  begin
        t:= t / 1000.0;
        for i:= 1 to m do
        begin
          t:= t + i / 999999.0;
          d:= t * t + i;
          r:= (t + d) / (200000.0 * (i + 1));
          t:= t - r;
        end;
  end;
  writeln(t);
end;

begin
  t1:= Now;
  xxx(1, 999999999);
  t2:= Now;
  writeln(SecondsBetween(t2,t1));

  t1:= Now;
  xxx(1, 999999999);
  t2:= Now;
  writeln(SecondsBetween(t2,t1));
end.

37 秒

<小时/>

看起来Delphi仍然处于链的底部:http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

我想知道从这个角度来看,Lazarus 与 Delphi 相比如何。

最佳答案

根据您的代码,32位Delphi编译器的缓慢之处在于浮点算术支持,它远未优化,并且将大量内容复制到FPU堆栈上/到FPU堆栈。

就浮点运算而言,不仅 Java JITted 代码会更快。即使是现代的 JavaScript JIT 编译器也比 Delphi 好得多!

这个blog article is just a reference about this ,并提供有关 Delphi 浮点缓慢的汇编级解释:

enter image description here

但是,如果您使用针对 Win64 平台的 Delphi 编译器,它将发出的不是 x87 而是 SSE2 操作码,并且速度会快得多。我怀疑与 Java JITted 可执行文件相当。

并且,就 Java 而言,任何 Delphi 可执行文件将使用比 JVM 少得多的内存,因此在这里,Delphi 可执行文件完全步入正轨!

如果你想让你的代码更快,不要使用asm或低级优化技巧,而是改变你的算法。它可能比编译提示快一个数量级。专用进程将通过内联 asm 操作码来实现 - 看看 this great set of articles对于如此低级的黑客攻击。但掌握起来并不容易,通常proper software profiling and adding some cache is the best way to performance !

关于delphi - 如何在Delphi中使用现代CPU指令? (Java比Delphi快?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18610419/

相关文章:

Delphi 2010 - 为什么我不能声明带有泛型类型参数的抽象方法?

delphi - 为什么默认情况下我的 Delphi 7 中禁用可分配类型常量?

delphi - 如何模拟另一个类负责实例化的类?

delphi - 我可以让我的Delphi App在特定时间(例如12:00 AM)启动,而无需运行该应用程序吗?

delphi - Firemonkey:TSpeedButton IsPressed 没有可见效果?

delphi - TComponent 设计时弹出菜单访问

delphi - 我可以在一个单元中定义条件并在其他单元中使用它们吗?

delphi - 通过电子邮件将 StringList 作为附件发送 - Indy

delphi - 用于静态数组的Delphi记录运算符

delphi - 使用 ASM 调用对象方法 - 第 2 部分