Da bei ReplaceString() und FindString() immer die Strings kopiert werden, dachte ich, man kann die
PB-Funktionen bestimmt schlage, vor allem, wenn man nur 1 Zeichen statt eines längeren Strings ersetzen will.
Aber weit gefehlt! Den PB-Compiler schlägt man nur in einem einzigen Fall. Sonst verliert man mit eigenem Code immer!
Der Fall den man gegen ReplaceString() gewinnt, ist wenn man nur einzelne Character ersetzen will und man
direkt mit einem String-Pointer arbeitet.
Soblad man einen String auch nur eine eine Funktion übergibt hat man bereits verloren.
Mich würde mal interssieren, was PB da intern macht!
Hier mein TestCode mit der Zeiterfassung für 1.000.000 Aufrufe
Achtung: Complierung ohne Debugger oder Exe erstellen, sonst macht das keinen Sinn
PB-ReplaceString 114ms
RelaceChar Procedure 27ms
ReplaceChar Macro 25ms
leerer Funcitonsaufruf MyReplaceString 232ms, selbst wenn man die Stringrückgabe entfernt sind es noch 150ms
Code: Alles auswählen
EnableExplicit
Structure pChar ; virtual CHAR-ARRAY, used as Pointer to overlay on strings
c.c[0] ; fixed ARRAY Of CHAR Length 0
EndStructure
Procedure ReplaceChar_(*String, cSearch.c, cReplace.c)
Protected *char.Character ; Pointer to a virutal Char-Struct
*char = *String
If *char
While *char\c ; until end of String
If *char\c = cSearch
*char\c = cReplace ; replace the Char
EndIf
*char + 2 ; Index to next Char
Wend
EndIf
EndProcedure
Macro ReplaceChar(String, cSearch, cReplace)
Define *char.Character ; Pointer to a virutal Char-Array
*char = @String ; overlay the String with a virtual Char-Array
If *char
While *char\c ; until end of String
If *char\c = cSearch
*char\c = cReplace ; replace the Char
EndIf
*char + 2 ; Index to next Char
Wend
EndIf
EndMacro
Procedure.s MyReplaceString(String$, Search$, Replace$)
; Das bringt nichts, da bereits der leere Funktionsaufruf
; langsamer ist als PureBasic ReplaceString()
ProcedureReturn String$ ; Returns the number of replaced Chars
EndProcedure
Define s$, res$, t_pb, t_my, t_mac, t_str, K, p , N =1000000
s$ = "Ich bin ein String und war ein String"
; For K = 0 To 5
; s$ =s$ + s$
; Next
; PureBasic
t_pb = ElapsedMilliseconds()
For K=0 To N
res$ = ReplaceString(s$, "e", "E")
Next
t_pb = ElapsedMilliseconds()-t_pb
Debug "PB-Replace : " + t_pb + "ms"
Debug res$
Debug ""
; MyFunction
t_my = ElapsedMilliseconds()
For K=0 To N/2
ReplaceChar_(@s$,'e', 'E') ; um fair zu bleiben, müssen wir das wieder zurück tauschen
ReplaceChar_(@s$,'E', 'e') ; dafür dann aber nur die halbe Schleifenanzahl
Next
t_my = ElapsedMilliseconds()-t_my
Debug "MyReplaceFunction : " + t_my + "ms"
Debug res$
Debug ""
; MyMacro
t_mac = ElapsedMilliseconds()
For K=0 To N/2
ReplaceChar(s$,'e', 'E')
ReplaceChar(s$,'E', 'e')
Next
t_mac = ElapsedMilliseconds()-t_mac
Debug "MyReplaceMacro : " + t_mac + "ms"
Debug ""
; MyMacro
t_str = ElapsedMilliseconds()
For K=0 To N
res$ = MyReplaceString(s$, "e", "E")
Next
t_str = ElapsedMilliseconds()-t_str
Debug "EmptyFunction : " + t_str + "ms"
Debug ""
MessageRequester("Ergebnis", "PB : " + t_pb + "ms" + #CRLF$ + "MyFunction : " + t_my + "ms" + #CRLF$ + "MyMacro : " + t_mac + "ms" + #CRLF$ + "EmptyFunction : " + t_str + "ms" + #CRLF$)