| Autor |
Beitrag |
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Do 22.05.08 19:31
Hallo,
ich führe momentan mal wieder Performancetests durch. Der vollständigkeit halber möchte ich die alte Lesevariante (das mit file of byte) einbeziehen. Nur da ich damit bisher kaum gearbeitet habe, mal so in die Runde: wie übersetzt man meinen StreamCode am performnatesten in die alte Variante?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| for j:=0 to TestFileSize-1 do BigBuf[i]:=random(256); t:=GetTickCount; FS:=TFileStream.Create('Test.txt', fmOpenReadWrite); FS.Write(BigBuf[0], TestFileSize); FS.Position:=2; FS.Read(Buf[1], 2); FS.Position:=FS.Size-2; FS.Write(Buf[1], 2); FS.Size:=10; FS.Free; inc(t2, GetTickCount-t); |
Denn bei der alten Variante habe ich für Zeile 5 z.B. das hier:
Delphi-Quelltext 1: 2:
| Reset(FH); Seek(FH, 2); |
was sicherlich nicht am schnellsten ist und für Write habe ich bisher nur das Byteweise schreiben gefunden  .
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 22.05.08 21:53
Du hast den Ressourcn-Schutzblock vergessen, der wird auch noch mal etwas Zeit kostn, aber er gehört dazu.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Fr 23.05.08 12:47
Hallo Luckie,
klar würde dies nen bissl Performance kosten. Aber meine Vergleichsunit schmeißt keine Exceptions, die muss man manuell abfragen. Da ich dies im Performancetest bisher nicht abfange, habe ich dies dem entsprechend weggelassen  . Vlt. baue ich es noch ein. Mal sehen, wie große der Unterschied zwischen try-finally-Blöcken und normalen if-Abfragen ist  .
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 23.05.08 14:25
Mit if-Abfragen wirst du bei TFileStream nicht weit kommen, weil die Methoden keine Fehlrcodes zurückgeben, sondern Exceptions werfen.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Fr 23.05.08 14:27
Bei TFileStream nicht, aber bei TFileStreamW (meiner eigenen Klasse) 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 28.05.08 09:46
Luckie hat folgendes geschrieben: | | Mit if-Abfragen wirst du bei TFileStream nicht weit kommen, weil die Methoden keine Fehlrcodes zurückgeben, sondern Exceptions werfen. |
Nicht ganz korrekt. TFileStream kapselt einen THandleStream und der nutzt ganz normal die WinAPI, man bekommt also über GetLastError schon eine Meldung zurück. Die Fehlerkondition bekommt man durch Vergleichen von Angeforderter Datenmenge zu gelieferter Datenmenge (wenn man Read und nicht ReadBuffer benutzt).
_________________ 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.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 29.05.08 10:59
Wenn aber das File gar nicht erst geöffnet werden kann (weil es nicht existiert, man zuwenig Rechte hat, es gesperrt ist, etc) fliegt aber sehr wohl eine Exception.. 
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 29.05.08 14:36
BenBE hat folgendes geschrieben: | Luckie hat folgendes geschrieben: | | Mit if-Abfragen wirst du bei TFileStream nicht weit kommen, weil die Methoden keine Fehlrcodes zurückgeben, sondern Exceptions werfen. |
Nicht ganz korrekt. TFileStream kapselt einen THandleStream und der nutzt ganz normal die WinAPI, man bekommt also über GetLastError schon eine Meldung zurück. Die Fehlerkondition bekommt man durch Vergleichen von Angeforderter Datenmenge zu gelieferter Datenmenge (wenn man Read und nicht ReadBuffer benutzt). |
Aber du kannst nicht sicher sein, ob das der letzte Fehler der Dateioperation war. Deswegen würde ich sicherheitshalber die Exceptions behandeln.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 29.05.08 14:50
Die Exception wird auch erst aus dem Nicht-Übereinstimmen der gelesenen und der angeforderten Anzahl an Bytes generiert. Siehe VCL-Sources ...
_________________ 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.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Di 03.06.08 18:22
@Luckie: BenBE hat schon recht. Die WinAPI wirft imho nur bei einem einzigen BEfehl ne Exeption (zu mindestens steht nur bei einer Funktion das da).
@Überstzung: ich habs inzwischen so hier. Mehr dürfte man nicht rausbekommen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| for j:=0 to TestFileSize-1 do BigBuf[i]:=random(256); t:=GetTickCount; AssignFile(FH, 'Test.txt'); Reset(FH); BlockWrite(FH, BigBuf[1], TestFileSize); Seek(FH, 2); BlockRead(FH, Buf[1], 2); Seek(FH, FileSize(FH)-2); BlockWrite(FH, Buf[1], 2); Seek(FH, 10); Truncate(FH); CloseFile(FH); inc(t1, GetTickCount-t); |
|
|
|