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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage