Speedtests: MeinString$="" vs. Len(MeinString$)=0

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Okay, probieren wir es mal:

Code: Alles auswählen

Procedure.s GetMonthName(nValue.l)
  If nValue > 0
    ProcedureReturn StringField("Januar,Februar,März,April,Mai,Juni,July,August,September,Oktober,November,Dezember", nValue, ",")
  EndIf
EndProcedure

Procedure.s SelectMonthName(nValue.l)
  Protected Result.s
  Select nValue
    Case  1 : Result = "Januar" 
    Case  2 : Result = "Februar" 
    Case  3 : Result = "März" 
    Case  4 : Result = "April" 
    Case  5 : Result = "Mai" 
    Case  6 : Result = "Juni" 
    Case  7 : Result = "July" 
    Case  8 : Result = "August" 
    Case  9 : Result = "September" 
    Case 10 : Result = "Oktober" 
    Case 11 : Result = "November" 
    Case 12 : Result = "Dezember" 
  EndSelect
  ProcedureReturn Result
EndProcedure

Procedure.s IfMonthName(nValue.l)
  Protected Result.s
  If nValue     =  1 : Result = "Januar" 
  ElseIf nValue =  2 : Result = "Februar"
  ElseIf nValue =  3 : Result = "März"
  ElseIf nValue =  4 : Result = "April" 
  ElseIf nValue =  5 : Result = "Mai"
  ElseIf nValue =  6 : Result = "Juni" 
  ElseIf nValue =  7 : Result = "July"
  ElseIf nValue =  8 : Result = "August"
  ElseIf nValue =  9 : Result = "September"
  ElseIf nValue = 10 : Result = "Oktober"
  ElseIf nValue = 11 : Result = "November" 
  ElseIf nValue = 12 : Result = "Dezember"
  EndIf
  ProcedureReturn Result
EndProcedure

; Test 1
Start = ElapsedMilliseconds()
For I = 1 To 1000000
  For J = 1 To 12
    GetMonthName(J)
  Next
Next
MessageRequester("GetMonthName", Str(ElapsedMilliseconds() - Start))

; Test 2
Start = ElapsedMilliseconds()
For I = 1 To 1000000
  For J = 1 To 12
    SelectMonthName(J)
  Next
Next
MessageRequester("SelectMonthName", Str(ElapsedMilliseconds() - Start))

; Test 3
Start = ElapsedMilliseconds()
For I = 1 To 1000000
  For J = 1 To 12
    IfMonthName(J)
  Next
Next
MessageRequester("IfMonthName", Str(ElapsedMilliseconds() - Start))
Ich hoffe der Test ist für alle 3 Funktionen gleichberechtigt. Die schönste (die erste) ist Wohl am langsamsten, aber weniger zu tippen :D
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

Hoffe ich hab nix falsch programmiert aber bei mir ist break schneller:

Code: Alles auswählen

bla.s = "quit"

For a = 0 To 20

  T1 = ElapsedMilliseconds()
  For b = 0 To 1000000
    Repeat
      If bla = "quit"
        quit = 1
      EndIf
    Until quit=1
    quit = 0
  Next b
  T2 = ElapsedMilliseconds()
  
  ergebnis$ + Str(T2 - T1) + " / "
  
  T1 = ElapsedMilliseconds()
  For b = 0 To 1000000
    Repeat
      If bla = "quit"
        Break
      EndIf
    ForEver
    quit = 0
  Next
  T2 = ElapsedMilliseconds()
  
  ergebnis$ + Str(T2 - T1) + #CRLF$
  
Next a

MessageRequester("",ergebnis$)
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Beitrag von Christian H »

ts-soft hat geschrieben:Okay, probieren wir es mal:

Code: Alles auswählen

Procedure.s GetMonthName(nValue.l)
  If nValue > 0
    ProcedureReturn StringField("Januar,Februar,März,April,Mai,Juni,July,August,September,Oktober,November,Dezember", nValue, ",")
  EndIf
EndProcedure
...
Die StringFunktionen von PB sind ja nicht gerade berauchend schnell. :(

Ich habe aber noch eine schnelle Möglichkeit für das "MonthName" Problem.

Code: Alles auswählen



  Dim MonthArray.s(11)
    MonthArray(0) = "Januar"
    MonthArray(1) = "Februar"
    MonthArray(2) = "März"
    MonthArray(3)= "April"
    MonthArray(4)= "Mai"
    MonthArray(5)= "Juni"
    MonthArray(6)= "July"
    MonthArray(7)= "August"
    MonthArray(8)= "September"
    MonthArray(9)= "Oktober"
    MonthArray(10)= "November"
    MonthArray(11)= "Dezember"

Procedure.s GetFormMonthArray(nValue.l)
  
    ProcedureReturn  MonthArray(nValue)
  
EndProcedure


; Test 4
Start = ElapsedMilliseconds()
For I = 1 To 1000000
  For J = 0 To 11
    GetFormMonthArray(J)
  Next
Next
MessageRequester("GetFormMonthArray", Str(ElapsedMilliseconds() - Start)) 
Gruß Christian
manunidi
Beiträge: 109
Registriert: 12.04.2006 22:44

Beitrag von manunidi »

@Christin H:

Deine Version ist bei mir ca 4 mal so schnell :) *FREUDE*
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@ts-soft
Die erste Methode ist bei mir auch die schnellste. Mit und Ohne Debugger.

PB4, Celeron 1.8MHz

FF :wink: :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Du Schwindler! :mrgreen:

PB 4 läuft doch gar nicht auf einem
> Celeron
mit nur
> 1.8MHz
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@AND51,

Mit einen Pot Kaffee und eine Stange Zigaretten schon. :mrgreen:

Ok, 1.8GHz

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten