gpt4 book ai didi

Delphi XE2 64 位字符串例程的运行时性能极慢

转载 作者:行者123 更新时间:2023-12-03 14:33:54 26 4
gpt4 key购买 nike

我正在将一些应用程序从 32 位 delphi 移植到 64 位 delphi,这些应用程序执行大量文本处理,并注意到处理速度的巨大变化。对一些程序进行了一些测试,例如,在 64 位中这已经比编译到 32 位花费了 200% 以上的时间(2000+ 毫秒与 ~900 相比)

这正常吗?

function IsStrANumber(const S: AnsiString): Boolean;
var P: PAnsiChar;
begin
Result := False;
P := PAnsiChar(S);
while P^ <> #0 do begin
if not (P^ in ['0'..'9']) then Exit;
Inc(P);
end;
Result := True;
end;

procedure TForm11.Button1Click(Sender: TObject);
Const x = '1234567890';
Var a,y,z: Integer;
begin
z := GetTickCount;
for a := 1 to 99999999 do begin
if IsStrANumber(x) then y := 0;//StrToInt(x);
end;
Caption := IntToStr(GetTickCount-z);
end;

最佳答案

目前还没有解决这个问题的方法,因为这是由于大多数 64 位字符串例程的代码都是用定义的 PUREPASCAL 编译的,IOW,它是普通的 Delphi,没有汇编程序,而许多重要的 32 位字符串例程的代码是由 FastCode 项目在汇编程序中完成的。

目前,64 位中没有 FastCode 等效项,我认为开发团队无论如何都会尝试消除汇编程序,特别是因为他们正在转向更多平台。

这意味着生成代码的优化变得越来越重要。我希望宣布的向 LLVM 后端的迁移将大大加快大部分代码的速度,因此纯 Delphi 代码不再是一个问题。

很抱歉,没有解决方案,但也许有一个解释。

更新

从 XE4 开始,相当多的 FastCode 例程已经取代了我在上面几段中谈到的未优化例程。它们通常仍然是 PUREPASCAL,但它们代表了良好的优化。所以情况并不像以前那么糟糕了。 TStringHelper 和纯字符串例程在 OS X 中仍然显示一些错误和一些极其缓慢的代码(特别是在从 Unicode 到 Ansi 的转换或反之亦然的情况下),但是 < win64的RTL部分似乎好很多。

关于Delphi XE2 64 位字符串例程的运行时性能极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11260441/

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