AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CreateFileW richtig verwenden

Ein Thema von Glados · begonnen am 11. Sep 2017 · letzter Beitrag vom 16. Okt 2017
Antwort Antwort
Seite 1 von 2  1 2      
Glados
(Gast)

n/a Beiträge
 
#1

CreateFileW richtig verwenden

  Alt 11. Sep 2017, 01:06
Ich bin in den Geschmack gekommen CreateFileW zu verwenden.
Jetzt stelle sich mir nur die Frage, wie ich das richtig verwende und die beste Performance raushole.

Aktuelle verwende ich es so
Delphi-Quellcode:

_Handle := CreateFileW(FileName, GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // für Dateien zu lesen
// oder
_Handle := CreateFileW(FileName, GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, 0); // für Dateien zu schreiben (zb blockwrite)
Kann man hier noch etwas besser machen?

Geändert von Glados (11. Sep 2017 um 01:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: CreateFileW richtig verwenden

  Alt 11. Sep 2017, 02:22
Was willst du besser machen?
Erstmal ist es "richtig" so, abgesehn von vielleicht "FileName" ... Wie ist das deklariert?

Nja, und was meinst du mit Performance,
bzw. was willst du erreichen?


Die API betreffend:
Non-Buffered (FILE_FLAG_NO_BUFFERING, FILE_FLAG_WRITE_THROUGH)
Asynchron (FILE_FLAG_OVERLAPPED)
Zugriffsmuster (FILE_FLAG_RANDOM_ACCESS oder FILE_FLAG_SEQUENTIAL_SCAN)

Ansonsten hat Performance erstmal rein garnichts mit CreateFile zu tun, sondern mit der Art des Zugriffs (was und wieviel wird wie gelesen/geschrieben), also prizipiell ist es egal oder CreateFile, TFileStream oder sonstwas.

Zitat:
Kann man hier noch etwas besser machen?
Zu 95% nein.
Und ansonsten hängt es von den Lese-/Schreibzugriffen ab, ob, wo und wie man was verbessern könnte.


Du hast doch natürlich schon lange die zum Thema gehörenden Dokumentationen gelesen und verstanden?
https://msdn.microsoft.com/en-us/lib.../aa363858.aspx > Caching Behavior

Wieso "Geschmack" und was ist deiner Meinung an CreateFile besser, als an TFileStream.Create, TFile.ReadXyz, TFile.WriteXyz und allem Anderen?
Denn die wenigen Zeilen da oben haben grunsätzlich erstmal keinerlei Vorteile, so wie sie sind.
$2B or not $2B

Geändert von himitsu (11. Sep 2017 um 02:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: CreateFileW richtig verwenden

  Alt 11. Sep 2017, 03:43
CreateFileW funktioniert genauso wie CreateFile. Wobei CreateFile ein Alias ist für CreateFileA bzw. CreaterFileW, je nach dem was man für einen Zeichensatz benutzt. Wobei CreateFileA von Windows intern nach CreateFileW gemappt wird. CreateFileA ist unter Windows mittlerweile nur noch eine leere Funktion.

Und was spricht gegen die Wrapper von der VCL? Warum alles von Hand machen? TFileStream. TMemoryStream. Stringlisten usw.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#4

AW: CreateFileW richtig verwenden

  Alt 11. Sep 2017, 11:05
Zitat:
Non-Buffered (FILE_FLAG_NO_BUFFERING, FILE_FLAG_WRITE_THROUGH)
Asynchron (FILE_FLAG_OVERLAPPED)
Zugriffsmuster (FILE_FLAG_RANDOM_ACCESS oder FILE_FLAG_SEQUENTIAL_SCAN)
Genau das meine ich. Würdest du mir diese erklären und wann man was nutzt?

Wenn ich OPEN_EXISTING or FILE_FLAG_NO_BUFFERING statt OPEN_EXISTING verwende, ist der Zugriff 10x schneller.

Zitat:
Und was spricht gegen die Wrapper von der VCL?
Ich finde hier BlockRead und BlockWrite besser für meinen Fall.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: CreateFileW richtig verwenden

  Alt 11. Sep 2017, 11:10
Zitat:
Und was spricht gegen die Wrapper von der VCL?
Ich finde hier BlockRead und BlockWrite besser für meinen Fall.
Ist/Findest du es besser oder hast du nur keine Lust dir anzuschauen wie es mit TFileStream&Co geht?
Wäre nicht das erste mal dass sich Leute davor drücken weil sie "damals" CreateFile/BlockRead/BlockWrite gelernt haben
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#6

AW: CreateFileW richtig verwenden

  Alt 11. Sep 2017, 11:13
Ich weiß so ungefähr wie TFileStream anzuwenden ist.
Aber warum nun vom alten Code weggehen, wenn er perfekt funktioniert und das sogar schnell
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.081 Beiträge
 
Delphi 2009 Professional
 
#7

AW: CreateFileW richtig verwenden

  Alt 11. Sep 2017, 12:22
Und was spricht gegen die Wrapper von der VCL? Warum alles von Hand machen? TFileStream. TMemoryStream. Stringlisten usw.
Man kann fmCreate und eins von den fmShare nicht gleichzeitig verwenden sondern muss sich für eins davon entscheiden. Sonst fallen mir keine Nachteile ein.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: CreateFileW richtig verwenden

  Alt 11. Sep 2017, 12:39
Aber warum nun vom alten Code weggehen, wenn er perfekt funktioniert und das sogar schnell
Die neuen Klassen sind mindestens genauso schnell und dazu noch OOP.


Windows hat FILE_FLAG_RANDOM_ACCESS als Vorauswahl.
Wenn man Dateien sequentiell verarbeitet, dann kann man theoretisch Windows sagen, dass es den WindowsFileCache verwalten anpassen soll.
Wenn man aber keine Gigabyte oder mehr in der Datei umherschaufelt, hat es praktisch keinerlei spürbaren Einfluss.

Und gerade bei Non-Buffered wird es umstöndlich, da du dann nur noch in Schreib-/Lesevorgänge mit "ganzen" Sektoren (am Besten aber eher ganze Cluster und Verwaltungseinheiten in der WindowsFileCache) verwenden darfst, ansonsten knallt es.
Zugriffe auf kleinere Blöcke müsstest du dann erst mit einem eigenen Cache abfangen.
Der Witz ist, dass NonBuffered für kleine Dateien langsamer ist, da deine Anwendung auf das Ende der Operation warten muß und eben nicht den WFC verwenden kann, der standardmäßig immer aktiv ist.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: CreateFileW richtig verwenden

  Alt 11. Sep 2017, 14:36
Also so wie immer, solange Du weißt was Du tust, ist es egal was Du tust.
Nur wenn Du glaubst Du wüßtest was Du tust....

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#10

AW: CreateFileW richtig verwenden

  Alt 11. Sep 2017, 15:59
Ich glaube ich bleibe dann einfach bei obigen Zeilen.
Eine letzte Frage aber noch. Wo müsste ich FILE_FLAG_NO_BUFFERING einfügen, wenn ich es verwenden möchte?
Muss das durch FILE_ATTRIBUTE_NORMAL ersetzt werden?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:09 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