私は、基本的なことを本当に理解したり考えたりすることなく、Delphi を使いこなしてきた、いわゆる開発者の 1 人です。この場合、私は文字列について話しています。
メモリを事前に割り当てると速度が大幅に向上することは理解していますが。単純な実世界のケースでそれを使用する方法がわかりません (これは、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 バージョンを自由に参照してください (つまり、モッズがおしゃべりまたは主観的なものとして削除しないと仮定します)。
文字列メモリの事前割り当てを最適化することにより、非常に大きなループ/大量のデータでマイクロ最適化を行う必要がある単純な日常のケースにもっと興味があります。