Zahlen formatieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Zahlen formatieren

Beitrag 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?".
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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)
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Sylvia
verheiratet<br>1. PureGolf-Gewinner
Beiträge: 487
Registriert: 29.08.2004 09:42
Wohnort: Old Europe

Beitrag 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.
Basic Pur = PureBasic
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag 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 :)
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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.....
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Antworten