我是那些所謂的開發人員之一,他們沒有真正理解甚至沒有考慮過基本知識,就與Delphi一起獲得了方向。在這種情況下,我說的是字符串。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不會將它刪除爲聊天或主觀)
我更感興趣的是簡單的日常案例其中一個需要通過優化字符串內存預分配在非常大的循環/大量數據中進行微優化。
由於500內部服務器錯誤狀態,大部分字符串問題都是因爲編譯器總是希望創建新內存,將字符串複製到新數據中,然後釋放舊內存。開始整合FastMM的Delphi版本對此做了一些改進,但只要您能夠在時間密集型的過程中遠離字符串,這是件好事。總之,你的示例代碼可能不會從任何技巧中受益。如果您對性能感興趣,請始終對您的應用進行配置,以查明您的程序在哪裏執行其執行時間。 – Glenn1234
@ Glenn1234 +1「如果您對性能感興趣,請始終配置您的應用,以查明您的程序在哪裏花費其執行時間。」 – RobertFrank
我恐怕你們錯過了我的觀點,我**使用我的分析器,並且我完全知道我的應用程序中的薄弱點(並且仍然在發現),我正在/正在嘗試查看是否有空間對於字符串分配方面的改進(通常來說,不僅僅是我發佈的示例代碼),希望這可以闡明我的意圖 – TheDude