Seite 1 von 2

WriteByte(1,ReadByte(0)) beschleunigen?

Verfasst: 12.11.2006 13:35
von RSBasic
Hi ihr, ich arbeite gerade an einem Test-Projekt, wodurch man die geschätzte Dauer ermitteln kann und die Übertragungsrate. Mein Problem ist, wenn ich eine Datei in Bytes kopiere, dann ist bei Übertragungsrate nur ca. 5 bis 10 MB in der Sekunde. Kann ich irgendwie beschleunigen?

Code: Alles auswählen

Procedure Kopieren(Parameter)
OpenFile(0,"3DMark06_v102_installer.exe")
CreateFile(1,"D:\3DMark06_v102_installer.exe")
While Eof(0)=0
  WriteByte(1,ReadByte(0))
Wend
CloseFile(0)
CloseFile(1)

End
EndProcedure

Procedure Prozent(Parameter)
Repeat
Ergebnis$ = Str(FileSize("D:\3DMark06_v102_installer.exe")/1024/1024)
SetGadgetText(2,Ergebnis$)
SetGadgetText(7,Str(FileSize("3DMark06_v102_installer.exe")/1024/1024))
SetGadgetState(0,Val(Ergebnis$))
Delay(100)
ForEver
EndProcedure

Procedure Rate(Parameter)
Repeat
a = Val(GetGadgetText(2))
Delay(1000)
b = Val(GetGadgetText(2))
SetGadgetText(1,Str(b-a))
Rechnen$ = Str(Val(GetGadgetText(7))-Val(GetGadgetText(2)))
If GetGadgetText(1)="0"=0
SetGadgetText(3,Str(Val(Rechnen$)/Val(GetGadgetText(1))))
EndIf
ForEver
EndProcedure

If OpenWindow(0, 100, 100, 500, 500,"Copy", #PB_Window_SystemMenu) 
  If CreateGadgetList(WindowID(0)) 
    ProgressBarGadget(0, 10, 50, 480, 20, 0,FileSize("3DMark06_v102_installer.exe")/1024/1024,#PB_ProgressBar_Smooth)
    TextGadget(1,10,10,100,20,"0",0)
    TextGadget(2,10,30,100,20,"0",0)
    TextGadget(3,10,80,100,20,"0",0)
    TextGadget(4,110,10,100,20,"MB/Sekunde",0)
    TextGadget(5,110,30,100,20,"MB",0)
    TextGadget(6,110,80,100,20,"Sekunden",0)
    TextGadget(7,220,30,100,20,"",0)
    
    
    CreateThread(@Kopieren(), 154)
    CreateThread(@Prozent(), 154)
    CreateThread(@Rate(), 154)
  EndIf
  SetGadgetColor(0,#PB_Gadget_FrontColor,RGB(159,213,0))
  SetGadgetColor(0,#PB_Gadget_BackColor, RGB(234,255,170))
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Bitte helft mir.

Verfasst: 12.11.2006 15:09
von Deeem2031
Es ist schneller wenn du große Datenblöcke oder gleich die ganze Datei in den Speicher ließt und dann in die andere Datei schreibst:

Code: Alles auswählen

Buffer = AllocateMemory(Lof(0))
ReadData(0,Buffer,Lof(0))
WriteData(1,Buffer,Lof(0))
FreeMemory(0)

Re: WriteByte(1,ReadByte(0)) beschleunigen?

Verfasst: 12.11.2006 15:16
von Kiffi
RSBasic hat geschrieben:

Code: Alles auswählen

Procedure Kopieren(Parameter)
OpenFile(0,...)
CreateFile(1,...)
[...]
ich hoffe, Dein Tool ist für den Eigengebrauch bestimmt und Du lässt es nicht
auf die Öffentlichkeit los.

Grüße ... Kiffi

Verfasst: 12.11.2006 15:25
von RSBasic
@Kiffi
Wie meinst du das? Meinst du mit der Datei? Ich habe die Datei als Beispiel genommen, weil die Datei groß ist. Ich kann ja schlecht testen, wenn die Datei nur ein paar MB hat.

@Deeem2031
Ich habe anstatt was ich geschrieben habe, das reingeschrieben. Aber wenn ich mit dein Code die Datei kopiere, dann kann ich aber nicht bestimmten, wieviel er schon kopiert hat und wieviel MB in der Sekunde gebraucht hat.

Habt ihr eine andere Möglichkeiten?

Verfasst: 12.11.2006 15:43
von Kiffi
> Wie meinst du das? Meinst du mit der Datei?

nein, ich meine, dass Du weder bei OpenFile() noch bei CreateFile()
überprüfst, ob die Befehle erfolgreich ausgeführt wurden.

Außerdem solltest Du OpenFile() durch ReadFile() ersetzen.

Grüße ... Kiffi

Verfasst: 12.11.2006 15:58
von AND51
RSBasic hat geschrieben:Habt ihr eine andere Möglichkeiten?
Ja, schau dir beispielsweise mal FileSize() und Lof() und Loc() an.

Mit den beiden Befehlen Lof() und Loc() kannst du dir ganz simpel einen Ladebalken bauen:

Code: Alles auswählen

Procedure Kopieren(Parameter) 
OpenFile(0,"3DMark06_v102_installer.exe") 
CreateFile(1,"D:\3DMark06_v102_installer.exe") 
While Eof(0)=0 
  Debug StrF(Loc(0)/Lof(0)*100)+"% fertig"
  WriteByte(1,ReadByte(0)) 
Wend 
CloseFile(0) 
CloseFile(1) 

End 
EndProcedure 
Nach wie vor gilt: If abfragen und die Tipps der anderen noch einbauen!

Verfasst: 12.11.2006 16:09
von manunidi
warum machst du das mti einer datei?

Mach es einfach so:

lass dir einen memory allocaten mit z.b. 10 mb, dann füllst du den, und dann holst du dir die millisekunden in start zb. und dnan schreibst du aus dem speicher auf die festplatte, udn dann hostl du wieder die millisekunden, ziehst die von start ab, dann kannst du es dir leicht ausrechenen, wie schnell!

Verfasst: 12.11.2006 16:12
von Kaeru Gaman
welche Übertragungsrate meinst du überhaupt?

wenn du die übertragungsrate speicher/platte meinst, dann brauchst du ne datei, is klar.

aber wenn du ne netzübertragung timen willst, ist es absolut kontraduktiv,
das ganze durch die festplatte ausbremsen zu lassen.

Verfasst: 12.11.2006 16:14
von RSBasic
@manunidi
Ich möchte diese Dauer und wieweit der ist als Nebenfeature einbauen. Ich mach als Haupttool einen Kopiervorgang.

Verfasst: 13.11.2006 21:32
von mknjc
Gut dann ließt du einfach immer sagen wir 64 kb der ersten datei in den speicher und schreibst ihn dann.

Diesen Vorgang zählst du einfach und teilst ihn durch die besher benötigte zeit.

Das mit der Übertragungsrate wird aber auch nicht extrem besser werden.

Vorallen auf schlecht defragmentierten Festplatten.

Das weiter zur erklären würd OT werden.

Mfg mknjc