gpt4 book ai didi

德尔福;传递 const 字符串与传递 var 字符串的性能

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

快一点;我是否正确地认为将字符串“作为 CONST”传递给方法比将字符串作为“VAR”传递需要更多的开销?如果字符串参数声明为 CONST,编译器将让 Delphi 复制该字符串,然后传递该副本,对吗?

问题的起因有点乏味;我们有一个遗留的 Delphi 5 实用程序,它的日子确实屈指可数了(替代品正在开发中)。它进行大量的字符串处理,经常在各种函数和过程之间传递 1-2Kb 字符串。在整个代码中,都遵守了使用 CONST 或 VAR 传递参数(取决于手头的工作)的“正确”观察。我们只是在寻找一些“快速胜利”,可能会减少执行时间几微秒,以帮助我们渡过难关,直到新版本准备就绪。我们考虑将内存管理器从默认的 Delphi 5 更改为 FastMM,并且我们还想知道是否值得改变字符串传递的方式 - 因为代码可以很好地处理作为 const 传递的字符串,我们不这样做如果我们将这些声明更改为 var,就会发现问题 - 该方法中的代码不会更改字符串。

但它真的会产生任何实际影响吗? (该程序实际上只是对这些 1kb 以上的字符串进行大量处理;高峰时间每分钟处理数百个字符串)。在重写中,这些字符串被保存在对象/类变量中,因此它们根本没有真正以相同的方式复制/传递,但在遗留代码中,它是非常“老派”的 pascal。

当然,我们会分析程序的整体运行情况,看看我们做了什么改变,但如果我们在第一个实例中对字符串传递的工作方式完全错误,那么实际尝试就没有意义!

最佳答案

不,在您的情况下使用 constvar 不应该有任何性能差异。在这两种情况下,指向字符串的指针都作为参数传递。如果参数是 const,编译器将不允许对其进行任何修改。请注意,如果您遇到困难,这并不排除对字符串进行修改:

procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s := 'foo bar baz';
UniqueString(s);
SetConstCaption(s);
Caption := s;
end;

procedure TForm1.SetConstCaption(const AValue: string);
var
P: PChar;
begin
P := PChar(AValue);
P[3] := '?';
Caption := AValue;
end;

这实际上会更改调用方法中的本地字符串变量,证明只传递了指向它的指针。

但一定要使用FastMM4,它应该会对性能产生更大的影响。

关于德尔福;传递 const 字符串与传递 var 字符串的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1951192/

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