Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Delphi vs. Windows, warum kopiert Windows schneller? (https://www.delphipraxis.net/144157-delphi-vs-windows-warum-kopiert-windows-schneller.html)

Angel4585 1. Dez 2009 14:07


Delphi vs. Windows, warum kopiert Windows schneller?
 
Hallo!

Ich hab keine Ahnung ob ich in der Sparte hier richtig bin, aber im Verschieben seid ihr ja Weltmeister :)

Ich kopiere eine Datei mit den Methoden BlockRead und BlockWrite.

Eine 50 MB-Datei über Netzwerk braucht per Explorer(STRG+C & STRG+V) ca. 10 Sekunden.
Die gleiche Datei über Netzwerk per BlockRead&BlockWrite braucht ebenfalls 10 Sekunden.
Soweit so gut.

Nun habe ich aber eine MicroSDHC-Karte.
Die 50MB Datei per Explorer dauert ebenfalls ca. 10 Sekunden.
Die 50MB Datei per BlockRead&BlockWrite dauert hier auf einmal knapp ne Minute(57 Sekunden) :shock:

Kann mir jemand erklären wie hier dieser Unterschied zustande kommt? :gruebel:
Und kommt mir jetz nich mit Cache :mrgreen:

Luckie 1. Dez 2009 14:12

Re: Delphi vs. Windows, warum kopiert Windows schneller?
 
Welche Blockgröße liest denn BlockRead/BlockWrite?

himitsu 1. Dez 2009 14:13

Re: Delphi vs. Windows, warum kopiert Windows schneller?
 
Das ist die Cache (WFC) :mrgreen:

Wie kopierst du es denn genau?

Angel4585 1. Dez 2009 14:21

Re: Delphi vs. Windows, warum kopiert Windows schneller?
 
Also ich darf hier nur ausschnitte posten, deshalb mal das relevante:

Delphi-Quellcode:
var
Buf: array[1..8191] of Char;
gel, ges: Integer;
begin
repeat
try
try
BlockRead(fFrom,Buf,SizeOf(buf),gel);
BlockWrite(fTo,buf,gel,ges);
inc(iPos,gel);
except
  //IOError abfangen
  end;
until(gel<>ges)or(gel=0);
end;
Allerdings irritiert mich da selbst gerade warum das buf-Array von 1-8191 geht. Ein Block sollte doch ne Zweierpotenz sein oder? :gruebel:

himitsu 1. Dez 2009 14:36

Re: Delphi vs. Windows, warum kopiert Windows schneller?
 
vermutlich ist 0..8191 gemeint

Char macht sich auch gut (dieses ist ab Delphi 2009 aber doppelt so groß)


PS: eigentlich sollte es schneller gehn, immerhin schreibst du ja in den schnellen WFC und nicht direkt auf die Karte.
Wobei ich hier auch eher in bis zu 64 KB-Schritten arbeiten würde.

Muß denn ein Fortschritt angezeigt werden?

Angel4585 1. Dez 2009 14:40

Re: Delphi vs. Windows, warum kopiert Windows schneller?
 
Ja wird ein Fortschritt angezeigt, aber ich hatte testweise schon alles auskommentiert, sodass nurnoch das reine kopieren drin war. Also am Fortschritt liegts nicht.

Namenloser 1. Dez 2009 14:42

Re: Delphi vs. Windows, warum kopiert Windows schneller?
 
Zitat:

Zitat von himitsu
Char macht sich auch gut (dieses ist ab Delphi 2009 aber doppelt so groß)

Unter C vielleicht, unter Delphi ist es semantisch falsch. Char ist immer ein Glied einer Zeichenkette - und nur mehr oder weniger zufällig unter Delphi<2009 genau ein Byte groß. Der Datentyp "Byte" wäre hier gefragt.

Mal abgesehen davon, was spricht dagegen, einfach direkt die Windows API-Funktionen zu benutzen? (Delphi-Referenz durchsuchenCopyFile)
Die Windowsentwickler werden sich schon einige Gedanken darüber gemacht haben, wie sie ihre Funktionen auf Performance optimieren.

tkone 1. Dez 2009 16:26

Re: Delphi vs. Windows, warum kopiert Windows schneller?
 
windows haut anfangs alles was reinpasst in den cache.
dadurch gehts anscheinend schneller

Angel4585 1. Dez 2009 21:01

Re: Delphi vs. Windows, warum kopiert Windows schneller?
 
Ich hatte es heut mittag nochmal mit nem größeren Buffer getestet und tatsächlich, nimm ich anstatt 8K 64K gehts sehr schnell, innerhalb von 10 Sekunden waren die 50 MB aufm Stick.. bzw auf der Karte.

sx2008 1. Dez 2009 23:10

Re: Delphi vs. Windows, warum kopiert Windows schneller?
 
Zitat:

Zitat von himitsu
vermutlich ist 0..8191 gemeint

Das könnte die entscheidende Bremse sein.
Wenn man immer ein Byte zuwenig kopiert ist das sicher schlecht für die Performance.
Ab einer bestimmten Puffergrösse (8kB, 16kB oder 32kB) bringt ein grösserer Puffer keine Verbesserung.
64kB oder 128kB bringen nach meiner Erfahrung nicht mehr als 32kB.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.
Seite 1 von 3  1 23      

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