Warum sind die Delphi-Bibliotheken zlib und zip unter 64 Bit so langsam?
eim Benchmarking einer realen Anwendung stieß ich auf ein überraschendes Leistungsmerkmal in Bezug auf die im Lieferumfang von Delphi enthaltenen Bibliotheken zlib und zi
Meine reale Anwendung exportiert XLSX-Dateien. Dieses Dateiformat ist eine Sammlung von XML-Dateien, die in eine ZIP-Containerdatei eingeschlossen sind. Der XLSX-Exportcode generiert die XML-Dateien und leitet sie dann an die Delphi-ZIP-Bibliothek weiter. Nachdem ich die XML-Dateigenerierung so optimiert hatte, dass die ZIP-Erstellung der Engpass war, stellte ich zu meiner Überraschung fest, dass 64-Bit-Code erheblich langsamer war als 32-Bit-Cod
m dies weiter zu untersuchen, habe ich dieses Testprogramm erstell
program zlib_perf;
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.Classes, System.Diagnostics, System.Zip;
const
LoremIpsum =
'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod '+
'tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, '+
'quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo '+
'consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse '+
'cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat '+
'non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';
function GetTestStream: TStream;
var
Bytes: TBytes;
begin
Result := TMemoryStream.Create;
// fill the stream with 500MB of lorem ipsum
Bytes := TEncoding.UTF8.GetBytes(LoremIpsum);
while Result.Size < 500*1024*1024 do
Result.WriteBuffer(Pointer(Bytes)^, Length(Bytes));
end;
procedure DoTest;
var
DataStream, ZipStream: TStream;
Stopwatch: TStopwatch;
Zip: TZipFile;
begin
DataStream := GetTestStream;
try
ZipStream := TMemoryStream.Create;
try
Zip := TZipFile.Create;
try
Zip.Open(ZipStream, zmWrite);
Stopwatch := TStopwatch.StartNew;
DataStream.Position := 0;
Zip.Add(DataStream, 'foo');
Writeln(Stopwatch.ElapsedMilliseconds);
finally
Zip.Free;
end;
finally
ZipStream.Free;
end;
finally
DataStream.Free;
end;
end;
begin
DoTest;
end.
Ich habe das Programm sowohl unter XE2 als auch unter XE7 für 32- und 64-Bit sowie mit den Standardoptionen für den Compiler für die Release-Konfiguration kompiliert. Auf meinem Testcomputer läuft Windows 7 x64 auf einem Intel Xeon E5530.
Hier sind die Ergebnisse
Compiler Target Time (ms) XE2 Win32 8586 XE2 Win64 18908 XE7 Win32 8583 XE7 Win64 19304
Ich habe dieselbe Datei mit der ZIP-Funktion der Explorer-Shell komprimiert und mein grobes Stoppuhr-Timing betrug 8 Sekunden, sodass die oben angegebenen 32-Bit-Zeiten angemessen erscheinen.
Da der vom obigen Code verwendete Komprimierungsalgorithmus "zlib" ist (Delphis Postleitzahl unterstützt nur "store" und "deflate"), gehe ich davon aus, dass die von Delphi verwendete zlib-Bibliothek die Wurzel dieses Problems ist. Warum ist Delphis ZLIB-Bibliothek unter 64 Bit so langsam?