gpt4 book ai didi

delphi - Delphi中的字符串: Pre-allocate memory to increase performance in simple cases?

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

我是那些所谓的开发人员之一,他们在没有真正理解甚至没有考虑基础知识的情况下就使用了 Delphi。在本例中,我谈论的是字符串

虽然我确实了解预分配内存如何能够显着提高速度。我不明白如何在简单的实际情况中使用它(对于 TStringBuilder 更是如此)。

例如,假设我有以下代码,可以递归搜索文件夹并将结果添加到哈希列表:

var
FilesList : TDictionary<String, Byte>; // Byte = (file = 0, folder = 1)

// ------------------------------------------------------------------------------ //
procedure AddFolder(const AFolderName : String);
var
FileName : String;
AHandle : THandle;
FindData : TWin32FindData;
begin
AHandle := FindFirstFile(PChar(AFolderName + '*'), FindData);
if (AHandle = INVALID_HANDLE_VALUE) then
Exit;

repeat
if (FindData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY = 0) then
begin
{ Add a file. }
FileName := FindData.cFileName;
FilesList.Add(AFolderName + FileName, 0);
end
else if ((FindData.cFileName[0] <> '.') OR Not ((FindData.cFileName[1] = #0) OR (FindData.cFileName[1] = '.') And (FindData.cFileName[2] = #0))) then
begin
FileName := AFolderName + FindData.cFileName + '\';
FilesList.Add(FileName, 1);
AddFolder(FileName);
end;
until Not FindNextFile(AHandle, FindData);

Windows.FindClose(AHandle);
end;

我不确定这是否是一个很好的例子,但在这种情况下,我不清楚向变量 FileName 预分配内存如何有助于提高执行速度,尤其是我对它的长度一无所知。 假设这是可能的,如何实现?

或者预分配技术仅在连接/构建字符串时有用吗?

<小时/>

关于我的问题的注释:

  1. 这个问题主要针对XE2,但请随意引用其他delphi版本,因为我确信其他开发人员会从分享智慧中受益(也就是说,假设mods不会删除它因为闲聊或主观)

  2. 我对简单的日常情况更感兴趣,其中需要通过优化字符串来在非常大的循环/大量数据中进行微优化内存预分配。

最佳答案

直接字符串连接(例如)可能会很慢,因为要为附加的每个部分重新分配字符串的内存。有时新的大小实际上可以容纳在适当的位置,但有时必须将数据复制到新位置,释放旧缓冲区,等等。这需要时间。

不过,一般来说,除非您已使用性能分析器或明确的时序语句验证确实存在性能问题,否则您不必担心这一点。

关于delphi - Delphi中的字符串: Pre-allocate memory to increase performance in simple cases?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14207000/

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