Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TFileStream Read (https://www.delphipraxis.net/203288-tfilestream-read.html)

MicMic 1. Feb 2020 18:15

Delphi-Version: 10.3 Rio

TFileStream Read
 
Hallo,

was wäre denn schneller?

20 x TFileStream.Read(Daten,10)

oder

TFileStream.Read(Daten,200)

zu lesen?

Ich habe gerade obige Variante, da ich in "Daten" natürlich auch was suche. Bei der unteren Variante müsste ich dann natürlich noch schauen, wie ich am Besten in "Daten" mein Zeug suche. Natürlich sollte hier die Verarbeitung nicht ausbremsen :) Jedenfalls bezieht sich dieses Beispiel auf eine Datei und ich muss ggf. hunderte so lesen können.

"Daten" wäre hier (für obige Variante) ein Record mit 10 Bytes und natürlich kann man so, schön und einfach die gelesenen Bytes durchsuchen.

Gruß
Michael

Edit:
P.s. Ist sind nicht immer x 20
Mal weniger, mal mehr

p80286 1. Feb 2020 18:48

AW: TFileStream Read
 
Mehrmals Daten lesen ist immer langsamer als einmal. Es könnte sein, daß der Unterschied minimal ist aber er ist vorhanden.

Gruß
K-H

Luckie 1. Feb 2020 19:24

AW: TFileStream Read
 
Du musst abwägen. Wenn es einfacher ist die Datensätze einzeln zu lesen, dann würde ich das auch machen. Das macht eventuell auch den Code einfacher.

jfheins 1. Feb 2020 21:19

AW: TFileStream Read
 
Es lohnt sich wahrscheinlich nicht, Blöcke kleiner als 4KB zu lesen. (Sektorgröße aktueller SSDs)

Wenn du 10 Bytes anforderst, sendet die SSD wahrscheinlich 4096 bytes und es werden irgendwo 4086 Bytes weggeworfen oder in den Cache gelegt für den nächsten Zugriff.

himitsu 1. Feb 2020 22:53

AW: TFileStream Read
 
Ich glaub die Blöcke in Windows File Cache sind 256 KB groß.
Dass heißt Windows liest so oder so das erstmal in den Cache, bevor du daraus eine Kopie bekommst.

Und ob 20*10 oder 200, das ist somit alles schon im FileCache und die HDD ist egal.
Nun kommt es also nur noch auf die Anzahl deiner Zugriffe an und da ist 1 Mal natürlich schneller als 20 Mal.

Bei diesen winzigen Mengen und Anzahlen wären ansonsten sämtliche Optimierungen bezüglich Zugriffe auf HDD und Cache sinnlos.
z.B. MSDN-Library durchsuchenFILE_FLAG_NO_BUFFERING

Fazit: Scheibe deinen Code, so dass er schön und wartbar wird und mach dir sonst keine Gedanken darüber,
so lange es nicht um Millionen Zugriffe und Milliarden von Bytes geht.


Wenn es einfach ist, dann lies mehreres 1 Mal in einen eigenen Puffer und verarbeite den Puffer/Array dann
und ansonsten einfach eins nach dem Anderen kopieren und verarbeiten.


Erfahrungswerte: "sehr oft" weniger als 8 KB zu lesen macht kaum sinn, besser in Schritten/Mehrfachem von 64 KB, was auch der Speicherverwaltung im RAM entspricht. (VirtualAlloc: 64 KB Reservierungseinheiten in Teileinheiten von 8 KB)
Sektorgröße 512 Byte, bzw. bei neueren HDDs "nativ" 4 KB, auch wenn sie oft dem System den Zugriff auf 512 KB gewähren (weil immernoch einige Treiber/Programme zu doof sind und dann abkratzen, wenn es nicht genau 512 sind), oder wirklich die 4 KB Sektoren nativ rausgeben. (bei CD und DVD sind es auch um die 4 KB)
Joar, und SSD, SD-Card usw. oft 4 KB Speicher, aber beim Speicher das auch wieder geclustert (die Löschfunktion, für Neubeschreiben).
Die Partitionen sind dann aber im Dateisystemtreiber auch nochmal in Cluster aus mehreren Sektoren aufgeteilt ... oft 4 KB bis 64 KB

MicMic 7. Feb 2020 22:29

AW: TFileStream Read
 
Danke noch für die vielen Infos.
Gruß Mike


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:19 Uhr.

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