我是那些在没有真正理解甚至没有考虑基础知识的情况下就使用 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
有助于提高执行速度,尤其是我对它的长度一无所知。假设这是可能的,怎么办?
还是仅在连接/构建字符串时才使用预分配技术?
关于我的问题的注释:
问题主要针对XE2,但请随意参考其他 delphi 版本,因为我确信其他开发人员将从分享智慧中受益(也就是说,假设 mods 不会将其删除为健谈或主观)
我对需要通过优化字符串内存预分配在非常大的循环/大量数据中进行微优化的简单日常案例更感兴趣。