WriteByte(1,ReadByte(0)) beschleunigen?

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

WriteByte(1,ReadByte(0)) beschleunigen?

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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
a²+b²=mc²
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
manunidi
Beiträge: 109
Registriert: 12.04.2006 22:44

Beitrag 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!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@manunidi
Ich möchte diese Dauer und wieweit der ist als Nebenfeature einbauen. Ich mach als Haupttool einen Kopiervorgang.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

Beitrag 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
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Gesperrt