一位 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 浮点缓慢的汇编级解释:
但是,如果您使用针对 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/