gpt4 book ai didi

delphi - 长度有多快?

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

我需要在程序中经常读取字符串s的长度。我设置了一次 s 字符串,这样我就可以在变量 (NoOfChars) 中记住它的大小,如下所示:

type
MyClass= class
Public
s: string;
NoOfchars: integer;
end;

procedure MyClass.SetS(const MyString: String);
begin
s:= MyString;
NoOfchars := Length(s); // <-- store it once, read it often
end;

我想我在某处读到Length(s)与读取常量一样快,因为它只访问存储在字符串前面的“隐藏”字段中的字符串的长度。这是有道理的,但由于我们没有源代码,我们只能猜测。也许还涉及其他计算?

那么,我应该使用Length(s)还是应该记住变量中的长度?

最佳答案

您确实有源代码。它位于System 单元中。

function _UStrLen(const S: UnicodeString): Integer;
begin
Result := Longint(S);
if Result <> 0 then // PStrRec should be used here, but
Result := PLongint(Result - 4)^; // a private symbol can't be inlined
end;

这个辅助函数被标记为内联,并且编译器确实内联了它。该程序:

{$APPTYPE CONSOLE}

var
i: Integer;
s: string;

begin
i := Length(s);
Writeln(i);
end.

编译为以下内容:

....Project1.dpr.10: i := Length(s);004060E3 A19CAB4000       mov eax,[$0040ab9c]   // $0040ab9c holds the variable s004060E8 85C0             test eax,eax          // test for nil004060EA 7405             jz $004060f1          004060EC 83E804           sub eax,$04           // offset to length004060EF 8B00             mov eax,[eax]         // read length into eax004060F1 8BD8             mov ebx,eax           // compiler optimises i into ebx....

代码非常简单。检查字符串变量是否为nil。如果是这样,答案为零。否则,从字符串的适当偏移量读取长度。

这确实是一个非常快的功能。但是,即使是内联的,调用 Length 也不会像从局部变量中读取那样快。事实上,编译器可以很好地将局部变量优化到寄存器中。

因此,如果性能很重要,读取局部变量可以提高性能。但您必须对现实世界的代码进行计时,才能了解性能差异是否真正重要。

就我个人而言,如果我需要多次引用长度,出于可读性的原因,我倾向于将字符串长度存储在局部变量中。如果我知道每次调用该函数时该值都是相同的,则可以通过将该值存储在本地来清楚地表达这一点。

关于delphi - 长度有多快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23580031/

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