AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

Ein Thema von a.def · begonnen am 4. Jan 2017 · letzter Beitrag vom 6. Jan 2017
Antwort Antwort
Seite 3 von 4     123 4      
a.def
(Gast)

n/a Beiträge
 
#21

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 23:03
Ich dachte bis vor ein paar Stunden tatsächlich noch, dass das OK ist so wie ich meinen String im Speicher zusammengebaut habe.
Ich habe zwar schon von FillChar gehört wusste aber nicht, dass man es eben hier so gut einsetzen kann.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#22

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 23:08
FillChar ist ein mächtiges Instrument vor allem dann wenn man Strings\Und Konsorte zurücksetzen oder die Variable in dem Fall Result initialisieren will.
FillChar(Result, SizeOf(Result), 0);

gruss

Geändert von EWeiss ( 4. Jan 2017 um 23:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.119 Beiträge
 
Delphi 12 Athens
 
#23

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 23:26
FillChar ist ein "böser" Name, aber wenn man bedenkt, dass in C++ ein Byte auch als UCHAR benannt wird (unsigned char)
und dass "früher" auch im Delphi ein Char (AnsiChar) mal 1 Byte groß war.

PS: FillChar -> ZeroMemory (kennt auch Delphi)
In C++ gibt es noch SecureZeroMemory, da dort der Compiler eventuell das "Macro" MSDN-Library durchsuchenZeroMemory wegoptimiert, wenn man danach nicht mehr lesend auf diese Variable zugreift. (aber Delphi macht das nicht, also einfach den Hinweis im MSDN ignorieren )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#24

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 23:28
Wobei ich mich frage ob SetLength vor FillChar überhaupt von nöten ist denn
den Speicher könnte man direkt mit FillChar zuweisen.

Welchen Sinn macht das?

Zitat:
PS: FillChar -> ZeroMemory (kennt auch Delphi)
ZeroMemory ist doch letztendlich der WinApi32 ersatz für FillChar (Delphi).

gruss

Geändert von EWeiss ( 4. Jan 2017 um 23:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.119 Beiträge
 
Delphi 12 Athens
 
#25

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 23:42
Nein, kann man nicht.
FillChar/ZeroMemory überschreibt nur bestehenden Speicher. Es wird niemals Speicher reserviert.
PS: SetLength hat schon ein FillChar integriert. (aber nur für Arrays und nicht für Strings)

In Bezug auf Strings gibt es auch noch SetString, was ein SetLength+CopyMemory ist.

Sinn, erstmal in Bezug auf CodeConvertierung zwischen Delphi und C++.
Und dann die "logische" Ausrichtung. > FillChar/MemCopy/GetMem/FreeMem, ZeroMemory/CopyMemory/GetMemory/FreeMemory usw. also wie die Frage nach Record oder Static-Class
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 4. Jan 2017 um 23:56 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#26

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 23:47
Zitat:
FillChar/ZeroMemory überschreibt nur bestehenden Speicher. Es wird niemals Speicher reserviert.
Ok dann habe ich auch noch was dazu gelernt.

Bin jetzt davon ausgegangen das dies

FillChar(aBytes, SizeOf(aBufferSize), 0);

1. Die Variable aBytes initialisiert
2. die länge von aBytes mit SizeOf zuweist
3. Den zugewiesenen Speicher mit 0 füllt.

Sollte soweit stimmen bis auf das der Speicher nicht reserviert wird.

gruss

Geändert von EWeiss ( 5. Jan 2017 um 00:03 Uhr)
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#27

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 23:49
Wobei ich mich frage ob SetLength vor FillChar überhaupt von nöten ist denn
den Speicher könnte man direkt mit FillChar zuweisen.

Welchen Sinn macht das?

Zitat:
PS: FillChar -> ZeroMemory (kennt auch Delphi)
ZeroMemory ist doch letztendlich der WinApi32 ersatz für FillChar (Delphi).

gruss
Ich habe SetLength jetzt dahin verlegt, wo es gebraucht wird - da, wo die Buffer-Größe verändert wird. Das passiert A) nur am Anfang vor der Schleife und B) eventuell ganz am Ende ein Mal.
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#28

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 5. Jan 2017, 00:14
P.S.: das Tool, das mehrere GB pro Sekunde schreibt, das war auf meinem PC
Wie heisst das?
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#29

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 5. Jan 2017, 03:18
Möglicherweise musst Du Dich noch mit dem Windows Dateicache auseinandersetzen. Ein und derselbe Code habe hier auf dem System zeigt höchst unterschiedliche Laufzeiten. Die 500 Mbytes benötigen zwischen 1.6 und 8 Sekunden, um ihren Weg auf die Platte zu finden.
Gut, auch eine Frage der Hardware...

Anbei ein Bleispiel - Dein Source ohne eine Änderung!

Einmal aus meiner Windows 10 VM

und

Einmal aus dem nativen Windows 10 wo die VM drauf läuft. (Bei laufenden VM)

Mavarik
Miniaturansicht angehängter Grafiken
speedtest.png  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.119 Beiträge
 
Delphi 12 Athens
 
#30

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 5. Jan 2017, 09:53
MSDN-Library durchsuchenFlushFileBuffers nach dem Write, dann hat man auch die Zeit bis Windows wirklich alles an den Datenträger geschickt hat.

Aus diesem Grund ist auch beim Schreiben großer Dateien der Durchsatz am Anfang größer, als zum Ende hin, nachdem der RAM überfüllt ist.
Bzw. der Explorer kopiert ja auch am Anfang schneller, außer bei Wechseldatenträgern mit deaktiviertem Schreibcache. (Stichwort "schnelles Entfernen")
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08: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