| Autor |
Nachricht |
baka0815
      
Beiträge: 452
Erhaltene Danke: 10
Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
|
Verfasst: Di 10.01.12 13:07
Betrifft: allgemeinen Dateizugriff
Hallo zusammen!
Ich habe mir ein kleines Tool geschrieben um die Geschwindigkeit von WriteLn bei einem TextFile mit TFileStream zu vergleichen.
Herausgekommen sind bei mir große Unterschiede, daher vermute ich den Fehler in meiner Implementierung:
Hier das Ergebnis:
Die Unterschiede fallen ziemlich groß aus (15 zu 60 Sekunden), daher vermute ich einen Fehler in meiner Implementierung - oder sind die Unterschiede wirklich so groß?
Edit:
Ich habe meinen Test jetzt umgebaut, so dass ich erst in einen TMemoryStream schreibe und diesen dann per CopyFrom in einen TFileStream speichere. Das dauert dann sogar nur noch um die 10 Sekunden (3 Sekunden das Füllen des TMemoryStream, 7 Sekunden das CopyFrom).
Aber die Ursprungsfrage bleibt:
Warum ist das WriteBuffer des TFileStream soviel langsamer als WriteLn?
Einloggen, um Attachments anzusehen!
|
| |
|
|
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
|
|
Martok
      

Beiträge: 2837
Erhaltene Danke: 182
Win 2000, Win XP
Delphi 7, Turbo Delphi Exp.
|
Verfasst: Di 10.01.12 20:02
Kurz, hab keine Zeit:
Buffering. Dein Stream buffert gar nicht, TextFile hat 128byte und mit MemoryStream vorher... naja, den ganzen Stream eben.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Ich code EdgeMonkey -~==~- #ee-lounge in Freenode
|
| |
|
|
baka0815 
      
Beiträge: 452
Erhaltene Danke: 10
Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
|
Verfasst: Mi 11.01.12 11:05
Also stimmt meine Vermutung, dass das Write des TFileStream direkt auf die Festplatte schreibt (Flush) und nicht selbst puffert - wieso?
Gibt es in Delphi (wie z.B. in Java) einen BufferedStream, der mir die Pufferung bereits abnimmt oder muss ich mir da komplett selbst was bauen (ich nutze aktuell Delphi 2007).
Wo ist dann der Unterschied zwischen den Funktionen Write und WriteBuffer des TFileStream?
|
| |
|
|
Martok
      

Beiträge: 2837
Erhaltene Danke: 182
Win 2000, Win XP
Delphi 7, Turbo Delphi Exp.
|
Verfasst: Mi 11.01.12 12:28
baka0815 hat folgendes geschrieben : | | Also stimmt meine Vermutung, dass das Write des TFileStream direkt auf die Festplatte schreibt (Flush) und nicht selbst puffert - wieso? |
Geflusht wird nicht direkt, aber auch wenn Windows das selbst nochmal in seinen 64k-Schnipseln buffert ist das vergleichsweise langsam. Vermutlich wegen dem Verwaltungsaufwand - ein WriteFile kostet so um die 5us, besonders wenn man wenig schreibt. Wird nach oben hin natürlich mehr, aber die "Fixkosten" bleiben. Sieht man auch im ProcessMonitor schön.
baka0815 hat folgendes geschrieben : | | Gibt es in Delphi (wie z.B. in Java) einen BufferedStream, der mir die Pufferung bereits abnimmt oder muss ich mir da komplett selbst was bauen (ich nutze aktuell Delphi 2007). |
Bis BDS2006 gabs noch keinen. Sowas wollte ich immer mal bauen (und hab auch grade für MUO einen BufferedReadStream geschrieben), aber was komplett immer funktionierendes ist nicht so ganz einfach wie ich feststellen musste
TReader und TWriter Buffern allerdings, vielleicht ist das ja verwendbar.
Das komplette Streamingsystem gehört neugeschrieben, aber das systemweit umzupatchen (immerhin wird TFileStream überall verwendet) ist nicht so ganz einfach. Müsste man mal AndyH fragen. Und, was viel wichtiger ist: müsste man mal Zeit haben
baka0815 hat folgendes geschrieben : | | Wo ist dann der Unterschied zwischen den Funktionen Write und WriteBuffer des TFileStream? |
Kein Nennenswerter, nur die Datentypen sind etwas anders.
EDIT: nicht mal das, der Unterschied nur dass *Buffer eine Fehlerprüfung macht und ggf. eine Exception auslöst.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Ich code EdgeMonkey -~==~- #ee-lounge in Freenode
|
| |
|
|
jaenicke
      
Beiträge: 15840
Erhaltene Danke: 741
XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
|
Verfasst: Mi 11.01.12 12:46
baka0815 hat folgendes geschrieben : | | Gibt es in Delphi (wie z.B. in Java) einen BufferedStream, der mir die Pufferung bereits abnimmt oder muss ich mir da komplett selbst was bauen (ich nutze aktuell Delphi 2007). |
Ich habe die Art und Weise des Schreibens zwar nicht mehr im Kopf, aber vielleicht ist das ja etwas für dich:
www.delphi-forum.de/viewtopic.php?t=100088
(Und wenn nicht, sollte zumindest darauf aufzubauen sein.  )
|
| |
|
|
baka0815 
      
Beiträge: 452
Erhaltene Danke: 10
Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
|
Verfasst: Do 12.01.12 16:37
Danke dir für den Tipp, allerdings wäre es schön einen generischen TBufferedStream o.ä. zu haben, den man einfach über einen bestehenden TStream überstülpen kann, damit das nicht nur für Dateizugriff funktioniert.
Für diesen Beitrag haben gedankt: BenBE, Martok
|
| |
|
|
BenBE
       
Beiträge: 8625
Erhaltene Danke: 147
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 16.01.12 22:17
Also wenn es wirklich schnell sein sollte, nimmt man eh MMFs. Dann ist das Limit mehr oder weniger die Geschwindigkeit der Festplatte.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
| |
|
|
|