Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   ZLib Speed much slower than ZLibEx (https://www.delphipraxis.net/205652-zlib-speed-much-slower-than-zlibex.html)

user69 1. Okt 2020 20:58

ZLib Speed much slower than ZLibEx
 
Hallo Gemeinde,

mir ist gerade aufgefallen, das die ZLib die mit Delphi kommt extrem langsamer ist, als die ZLibEx. Bei meinen Test der Faktor 4-5. (bei D10 Sydney und auch bei Berlin). Somit muss ich wohl auf die ZLibEx zurück gehen.

Hat das auch schon wer beobachtet oder ne idee woran es liegen kann?
Kann es evtl. sein, dass es daran liegt dass ich aus dem komprimieren nicht nen ganzen Block lese, sondern Datensatz per Datensatz (also ganz viele kleine stücke) und die ZLibEx besser cached?

himitsu 2. Okt 2020 01:00

AW: ZLib Speed much slower than ZLibEx
 
Erstmal kommt es drauf an wie du das benutzt.
mit Streams, DynArrays oder auf einem statischen Buffer, also ob die Funktionen direkt oder mit noch was dazwischen ... teilweise sind die Funktionen schon bissl "ungünstig" aufgebaut.

Ansonsten kann Embarcadero nicht direkt etwas für das Tempo.
Hier wird ein vorkompilierter Fremdcode benutzt, von dem ich jetzt aber nicht direkt sagen kann auswelcher Quelle das kommt und in welcher Version (vermutlich aber nicht sehr aktuell)

OK, vor 2 Jahren wurde das mal wieder aktualisiert.
Zlib 1.2.11 am 2018-07-05, wobei das zumindestens der aktuelle Code ist, welcher auch schonwieder 3 Jahre alt ist (2017 laut Wiki),
was aber nichts drüber aussagt wie das kompiliert wurde.

user69 2. Okt 2020 12:15

AW: ZLib Speed much slower than ZLibEx
 
Also ich verwende Stream.

Zusätzlich habe ich noch etwas probiert - leider ohne finalen Erfolg
- Die obj Files der ZLib zwischen Delphi ZLib und ZLib Ex unterscheiden sich in der Größe (ca. 50%) und sind nicht kompatibel (Die Version ist bei beiden 1.2.11)
- die 1.2.11 ZLib ist genauso schnell, wie die 1.2.8
- Eine angepasste ZLib für 1.2.11 ist hier zu finden: https://github.com/ValtsS/Delphi-ZlibEx (leider nur OBJ files für 32 bit)

Kann mir jemand die OBJ files für 64 bit erstellen (die zur ZLib 1.2.11 passen)? Da ich nur Delphi habe kann ich auf BCC32/64 nicht zugreifen.
Oder eine Link posten?

Da ich nicht recht rausfinde, warum die Delphi Version so langsam ist muss ich da eher aufgeben und einfach die ZLibEx nutzen.

Vielen Dank.

user69 5. Mai 2021 21:15

AW: ZLib Speed much slower than ZLibEx
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich will das Thema noch mal mit nem Demo mit StopWatch (siehe attached) aufwärmen ... (bitte erst einmal Write nutzen vor nem Read)

Ich schreibe/lese ne Menge kleine Daten - hier mal als ein 160 MB File.
Dabei zeigt sich dass die ZLib gegen ZLibEx beim schrieben 2 mal so langsam ist. Beim Lesen sogar 10 mal so langsam.

Die Version bei ZLib ist neuer und ZLibEx wird auch wohl nicht mehr gewartet. Deshalb wollt ich ja umsteigen.
Aber bei dem Speed geht das nicht.

Kann das an dem Cache von ZLibEx liegen oder sind die Delphi zlib obj Files schlecht erstellt.

KodeZwerg 5. Mai 2021 22:41

AW: ZLib Speed much slower than ZLibEx
 
Auch schon benchmarks vs zip durchgeführt?

himitsu 6. Mai 2021 01:53

AW: ZLib Speed much slower than ZLibEx
 
Die ZIP-Klasse im Delphi benutzt auch nur die ZLib-Unit.

Man kann auch die DLL von 7-Zip verwenden, wo auch ein ZIP / ZLib oder ZLibEx drin ist.
Aber k.A. wie schnell/aktuell deren Implementierung ist. (könnte man in den Sourcen nachsehn, wenn man Langeweile hat)

user69 6. Mai 2021 07:22

AW: ZLib Speed much slower than ZLibEx
 
ZIP hab ich nicht weiter getestet - ich nutz die gzip Komprimierung on the fly während dem Speichern und Laden.
Eine DLL kommt leider für meinen Einsatz nicht in Frage.

Ich vermute auch das in 64bit folgende ZLibEx.pas Zeile Probleme macht:

Move(Pointer(Integer(param^.InBuffer) + param^.InPosition)^, buffer, result); //in ZBufferRead

Müsste das nicht eher zu NativeInt geändert werden um 64 bit kompatibel zu sein?

Move(Pointer(NativeInt(param^.InBuffer) + param^.InPosition)^, buffer, result);

himitsu 6. Mai 2021 07:28

AW: ZLib Speed much slower than ZLibEx
 
Ja.

Oder weglassen?
-> Direkt nach Pointer casten.

Ups, bei den Klammern verrutscht.

Wenn Pointer-Arithmetik aktiv ist (könnte aber jemand so unnett sein und es deaktivieren), dann kann man z.B. auch PByte für solche Casts benutzen.


Es müsste auch eine .O .OBJ geben, bzw. die sollte man sich aus den Quellcodes kompilieren können,
welche sich dann wie ZLib/RegEx/JPeg/... ins Delphi einkompilieren liese. (wenn jemand so schlau ist und die passende ImportUnit dafür schreiben kann)

user69 6. Mai 2021 07:34

AW: ZLib Speed much slower than ZLibEx
 
>Direkt nach Pointer casten
Wie würde das gehen (wegen der Addition)? Beispiel?

himitsu 6. Mai 2021 07:36

AW: ZLib Speed much slower than ZLibEx
 
War ein Denk-/Guckfehler.
Hatte es grade oben im Post nochmal berichtig. :oops:

Ja, würde gehen, aber nur mit einem Typen, der hierfür 1 Byte groß sind.
z.B. PByte


Würde das Offset z.B. 4 sein, also p+x*4, dann wäre auch ein 4 Byte-Typ OK und dann das *4 weglassen, weil es implizit über den Typ vom Compiler rein kommt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz