gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:02:50 27 4
gpt4 key购买 nike

一位 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com