AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) ReadFile und WriteFile durch Threads optmieren
Thema durchsuchen
Ansicht
Themen-Optionen

ReadFile und WriteFile durch Threads optmieren

Ein Thema von LTE5 · begonnen am 26. Dez 2017 · letzter Beitrag vom 1. Jan 2018
Antwort Antwort
Seite 1 von 2  1 2      
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

ReadFile und WriteFile durch Threads optmieren

  Alt 26. Dez 2017, 18:34
Ich benutze schon immer ReadFile und WriteFile, um eine Datei zu kopieren.
So kopiere ich 2 10 GB Dateien von einer SSD innerhalb von 4 Minuten und 25 Sekunden. Unstoppable Copier braucht dafür 4 Minuten und 10 Sekunden.
Das sind Durchschnittswerte nachdem ich etliche Tests durchlaufen habe. Der Windows-File-Cache war natürlich weg!

Ist es möglich eine Kopierfunktion mit ReadFile und WriteFile so zu trennen, dass ReadFile und WriteFile je in einem Thread laufen?
ReadFile befüllt eine Art Liste von der ich noch absolut keine Ahnung habe wie das sein soll, aus der sich WriteFile dann bedient.

Oder ist ganz davon abzuraten?
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.623 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: ReadFile und WriteFile durch Threads optmieren

  Alt 26. Dez 2017, 18:53
Theoretisch kann ReadFile Daten in einen Buffer lesen, aus dem WriteFile dann schreibt. Sowas wie eine Queue von x*4096 Bytes großen Buffern würde sich anbieten.

Aber ob das wirklich schneller ist, kann ich nicht sagen.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: ReadFile und WriteFile durch Threads optmieren

  Alt 26. Dez 2017, 18:58
Ich benutze schon immer ReadFile und WriteFile, um eine Datei zu kopieren.
Warum verwendest du nicht einfach die entsprechende WindowsAPI anstelle dir mit ReadFile/WriteFile manuell einen abzubrechen? Dort wären solche Optimierungen im Zweifelsfalle nämlich auch schon von Haus aus vorhanden.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: ReadFile und WriteFile durch Threads optmieren

  Alt 26. Dez 2017, 19:01
Weil so kann ich
auf Abbrechen reagieren
habe immer die bereits kopierten Bytes und die Bytes die im letzten Durchgang kopiert wurden in Variablen
und ich kann meinen eigenen Buffer setzen

Wie würde man denn das hier mit der WindowsAPI umschreiben? http://www.delphipraxis.net/192758-f...im-thread.html

Geändert von LTE5 (26. Dez 2017 um 19:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#5

AW: ReadFile und WriteFile durch Threads optmieren

  Alt 26. Dez 2017, 19:16
Warum verwendest du nicht einfach die entsprechende WindowsAPI anstelle dir mit ReadFile/WriteFile manuell einen abzubrechen? Dort wären solche Optimierungen im Zweifelsfalle nämlich auch schon von Haus aus vorhanden.
Ich weiß zwar nicht, ob das noch relevant ist, aber da ist eventuell Vorsicht geboten: Copying large files on Windows
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: ReadFile und WriteFile durch Threads optmieren

  Alt 26. Dez 2017, 19:19
Verstehe ich das richtig, dass, angenommen der Fall Program X wird von Windows XP bis 10 verwendet, ReadFile und WriteFile vor CopyFile(Ex) vorzuziehen ist, um maximale Kompatibilität zu wahren?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#7

AW: ReadFile und WriteFile durch Threads optmieren

  Alt 26. Dez 2017, 19:23
Weil so kann ich
auf Abbrechen reagieren
Die entsprechende Windows-API wäre dann wohl CopyFileEx. Mit den geeigneten Parametern kannst du das jederzeit abbrechen und auch das Buffering abschalten.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#8

AW: ReadFile und WriteFile durch Threads optmieren

  Alt 26. Dez 2017, 19:26
Verstehe ich das richtig, dass, angenommen der Fall Program X wird von Windows XP bis 10 verwendet, ReadFile und WriteFile vor CopyFile(Ex) vorzuziehen ist, um maximale Kompatibilität zu wahren?
Gehört XP denn überhaupt zu den unterstützen Zielplattformen von Delphi 10.2 Tokyo? Ich glaube kaum: Unterstützte Zielplattformen
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: ReadFile und WriteFile durch Threads optmieren

  Alt 26. Dez 2017, 20:13
Mein Programm funktioniert noch wunderbar mit Windows XP.
Man muss nur aufpassen welche Winapi-Aufrufe man macht.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: ReadFile und WriteFile durch Threads optmieren

  Alt 26. Dez 2017, 20:23
Ist es möglich eine Kopierfunktion mit ReadFile und WriteFile so zu trennen, dass ReadFile und WriteFile je in einem Thread laufen?
ReadFile befüllt eine Art Liste von der ich noch absolut keine Ahnung habe wie das sein soll, aus der sich WriteFile dann bedient.

Oder ist ganz davon abzuraten?
Es kommt darauf an.
Falls Du die Aktion auf einem einzigen Datenträger ausführen willst könnte das kontraproduktiv sein, es kommt auf die Position(ierung) des Schreiblesekopfes/die Laufwerkselektronik an.
Gleiches gilt im übertragenen Sinne für SSD/USB-Sticks wobei die natürlich keinen Schreib-LeseKopf haben. Im günstigsten Falle, kannst Du den Vorgang um eine Buffergröße verschränken, so daß das Schreiben kurz nach dem Lesen erledigt ist. Ist das Zielmedium beim Schreiben schneller als das Quellmedium beim Lesen, mußt Du für das Schreiben auf jeden Fall ein paar Ehrenrunden mit einrechnen.

Wenn du keine Spezialanwendung hast, bei der Du richtig hardwarenah arbeiten mußt/kannst, halte ich die Idee für verschwendete Zeit. Die paar Zehntel, die Du heraus quetschen kannst, erfordern einen solchen Aufwand daß das nur als Hobby-Anwendung vertretbar ist.
Unterschätze den Test-Aufwand nicht!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  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 07:15 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