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 :D

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 :D
Hab es nicht auf 'Speed' programmiert; es sollte auch nur seinen
Zweck erfüllen. Und das tut es gut !
Da mein Programm sehr Systemschmelzend :D 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.....