Seite 1 von 1
Zahlen formatieren
Verfasst: 12.09.2004 13:09
von CNESM
Hi,
hab ihr eine Funktion, die meine Zahl in ein besser lesbare Form bringt. Sprich:
8723497 in 8.723.497
Da ich gerade dabei bin, mein Projekt auf Geschwindigkeit umzustellen, würe ich gern einige Funktionen überprüfen. Wie kann ich herausfinden, ob die Funktion schnell oder langsam ist? Wie folgende Funktion. Scheint ja alles soweit zu gehen oder angezeigt wird die Sache ja auch schnell
Code: Alles auswählen
Global Zahl.s
If OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window")
CreateGadgetList(WindowID(0))
Zahl="2635478764563456" ;2.635.478.764.563.456
Position=Len(Zahl)-2 ;8
FertigeZahl$=Mid(Zahl,Position,3) ;482
Repeat
Position=Position-3
FertigeZahl$=Mid(Zahl,Position,3)+"."+FertigeZahl$
Until Position<3
FertigeZahl$=Mid(Zahl,1,Position-1)+"."+FertigeZahl$
MessageRequester("Information",FertigeZahl$,#PB_MessageRequester_Ok)
TextGadget(12,10,10,250,20,FertigeZahl$)
Repeat
EventID.l = WindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
Until Quit = 1
EndIf
End
Will nämlich nicht bei jeder Funktion euch fragen "Ist die gut oder was würdet ihr verbessern?".
Verfasst: 12.09.2004 14:03
von remi_meier
Code: Alles auswählen
Procedure.s FormateNumber(Zahl.s)
Position=Len(Zahl)-2 ;8
FertigeZahl$=Mid(Zahl,Position,3) ;482
Repeat
Position=Position-3
FertigeZahl$=Mid(Zahl,Position,3)+"."+FertigeZahl$
Until Position<3
ProcedureReturn Mid(Zahl,1,Position-1)+"."+FertigeZahl$
EndProcedure
Procedure.s FormateNumber2(Zahl.s)
Position = Len(Zahl)
*Zahl.BYTE = @Zahl
*Zahl + Position
neuzahl.s = Space(Position + ((Position-1) / 3))
*neuzahl.BYTE = @neuzahl
*neuzahl + Position + ((Position-1) / 3)
For z = 1 To Position + 1
*neuzahl\b = *Zahl\b
*Zahl - 1
*neuzahl - 1
If z > 1 And z % 3 = 1
*neuzahl\b = '.'
*neuzahl - 1
EndIf
Next
ProcedureReturn neuzahl
EndProcedure
zeit1 = ElapsedMilliseconds()
For z = 1 To 2000000
Zahl.s="2635478764563456" ;2.635.478.764.563.456
FertigeZahl$=FormateNumber(Zahl)
Next
zeit1 = ElapsedMilliseconds() - zeit1
zeit2 = ElapsedMilliseconds()
For z = 1 To 2000000
Zahl="2635478764563456" ;2.635.478.764.563.456
FertigeZahl$=FormateNumber2(Zahl)
Next
zeit2 = ElapsedMilliseconds() - zeit2
MessageRequester("Information","Zeit: "+Str(zeit1)+"ms"+Chr(13)+Chr(10)+"Zeit2: "+Str(zeit2)+"ms",#PB_MessageRequester_Ok)
Das wäre mal mein Vorschlag, bin mir nicht sicher, ob meine Proc fehlerfrei ist, da ich sie nur schnell hingeproggt habe. Man kann sie sicher noch optimieren... (man sieht aber schon einen Geschwindigkeitsvorteil).
greetz
remi
PS: Debugger ausschalten! (PB scheint bei Pointern mehr zu überprüfen als sonst)
Verfasst: 12.09.2004 14:47
von Deeem2031
Juhu ein Speedwettbewerb
Code: Alles auswählen
Procedure.s FormateNumber(Zahl.s)
Position=Len(Zahl)-2 ;8
FertigeZahl$=Mid(Zahl,Position,3) ;482
Repeat
Position=Position-3
FertigeZahl$=Mid(Zahl,Position,3)+"."+FertigeZahl$
Until Position<3
ProcedureReturn Mid(Zahl,1,Position-1)+"."+FertigeZahl$
EndProcedure
Procedure.s FormateNumber2(Zahl.s)
Position = Len(Zahl)
*Zahl.BYTE = @Zahl
*Zahl + Position
neuzahl.s = Space(Position + ((Position-1) / 3))
*neuzahl.BYTE = @neuzahl
*neuzahl + Position + ((Position-1) / 3)
For z = 1 To Position + 1
*neuzahl\b = *Zahl\b
*Zahl - 1
*neuzahl - 1
If z > 1 And z % 3 = 1
*neuzahl\b = '.'
*neuzahl - 1
EndIf
Next
ProcedureReturn neuzahl
EndProcedure
Procedure.s FormateNumber3(Zahl.s)
Protected SLen,TLen,SPos,TPos
SLen = Len(Zahl)
TLen = SLen + (SLen-1) / 3
Zahl + Space(TLen - SLen)
SPos = @Zahl + SLen
TPos = @Zahl + TLen
While SPos > @Zahl+3
SPos-3
TPos-3
CopyMemory(SPos,TPos,3)
TPos-1
PokeB(TPos,'.')
Wend
ProcedureReturn Zahl
EndProcedure
#c = 200000
zeit1 = ElapsedMilliseconds()
For z = 1 To #c
Zahl.s="2635478764563456" ;2.635.478.764.563.456
FertigeZahl$=FormateNumber(Zahl)
Next
zeit1 = ElapsedMilliseconds() - zeit1
Debug "1fertsch"
zeit2 = ElapsedMilliseconds()
For z = 1 To #c
Zahl="2635478764563456" ;2.635.478.764.563.456
FertigeZahl$=FormateNumber2(Zahl)
Next
zeit2 = ElapsedMilliseconds() - zeit2
Debug "2fertsch"
zeit3 = ElapsedMilliseconds()
For z = 1 To #c
Zahl="2635478764563456" ;2.635.478.764.563.456
FertigeZahl$=FormateNumber3(Zahl)
Next
zeit3 = ElapsedMilliseconds() - zeit3
MessageRequester("Information","Zeit: "+Str(zeit1)+"ms"+Chr(13)+Chr(10)+"Zeit2: "+Str(zeit2)+"ms"+Chr(13)+Chr(10)+"Zeit3: "+Str(zeit3)+"ms",#PB_MessageRequester_Ok)
Verfasst: 12.09.2004 19:46
von Sylvia
Hab es nicht auf 'Speed' programmiert; es sollte auch nur seinen
Zweck erfüllen. Und das tut es gut !
StringUsing() Achte auf die verbesserte Version im Nachtrag.
Verfasst: 13.09.2004 17:25
von CNESM
Hi,
da sind echt ein paar gute Funktionen dabei. Danke euch ganz lieb und mit dir Sylvia geh ich als Dankeschön schick essen
Hab es nicht auf 'Speed' programmiert; es sollte auch nur seinen
Zweck erfüllen. Und das tut es gut !
Da mein Programm sehr Systemschmelzend

arbeitet, möchte ich so viele Funktionen wie nur möglich schnell umsetzen

Verfasst: 16.09.2004 10:32
von Agent
Morsche!
Hm... bin grad über euren kleinen "Speedtest" gestolpert.
Sehr interessant.
Sagt (ihr speedfreaks), kann man pauschal sagen, was schneller umgesetzt wird? Also, z.b. Alles über Speicherfunktionen zu machen alla peek und poke??
Würde mich mal interessieren, nachdem ich das miniprog von deeem getestet hab (wo ich am schluss nix mehr gerafft hab)... *LOL*
Mercy
Verfasst: 16.09.2004 11:39
von NicTheQuick
Bei PB ist das so eine Sache. Bei bestimmten Themengebieten sind einmal die [c]PeekBWLF()[/c]- und [c]PokeBWLF()[/c]-Befehle besser, andererseits sind aber meist die Pointer das schnellere Verfahren.
Verfasst: 16.09.2004 11:53
von Agent
Axo.
Das die String-Befehle (ala Stringfield, mid und co) nicht die schnellsten sind, hab ich ja schon mitbekommen.
Du meinst also via *variable?
hm...damit sollte ich mich dann wohl mal mehr beschäftigen.....