Hast du wieder den Debugger an?

Ich habe mal die Schleifendurchläufe um das Zehnfache erhöht, weil es sonst so schnell ging.
Außerdem habe ich noch eine zweite reine Pointervariante geschrieben mit der selben Einschränkung. Der Replacement-String darf nicht größer sein als length.
Hier noch mal alles:
Code: Alles auswählen
Procedure ErsetzeString5(*input, pos.i, length.i, *replacement)
Protected *c.Character, *d.Character
*c = *input + (pos - 1) * SizeOf(Character)
*d = *replacement
While (*d\c And length >= 0)
*c\c = *d\c
*c + SizeOf(Character)
*d + SizeOf(Character)
length - 1
Wend
If (*d\c = 0)
*d + *input + (pos + length - 1) * SizeOf(Character) - *replacement
While (*d\c)
*c\c = *d\c
*c + SizeOf(Character)
*d + SizeOf(Character)
Wend
While (*c\c)
*c\c = 0
*c + SizeOf(Character)
Wend
Else
;length < len(*replacement)
EndIf
EndProcedure
Procedure ErsetzeString4(*input, pos.i, length.i, replacement.s)
Protected replaceLength.i = Len(replacement)
Protected *c.Character, *d.Character
If (replaceLength <= length)
CopyMemory(@replacement, *input + (pos - 1) * SizeOf(Character), replaceLength * SizeOf(Character))
If (replaceLength < length)
;MoveMemory(*input + (pos + replaceLength - 1) * SizeOf(Character), *input + (pos + length) * SizeOf(Character), )
*c = *input + (pos + length - 1) * SizeOf(Character)
*d = *input + (pos + replaceLength - 1) * SizeOf(Character)
While (*c\c)
*d\c = *c\c
*c + SizeOf(Character)
*d + SizeOf(Character)
Wend
While (*d\c)
*d\c = 0
*d + SizeOf(Character)
Wend
EndIf
Else
;fehlt noch
EndIf
EndProcedure
; a.s = "abcdefghijklmn"
; b.s = "xxx"
; ErsetzeString4(@a, 3, 3, @b)
; Debug a
;
; End
Macro ErsetzeString2(String, pos, laenge, ersatz)
Left(String, pos - 1) + ersatz + Mid(String, pos + laenge)
EndMacro
Macro ErsetzeString3(String , pos , laenge , Ersatz)
len_original = Len(PeekS(@String)) * SizeOf(Character)
l1 = pos + laenge - 1
len_rest = len_original - l1
b$ = PeekS(@String, pos - 1) + Ersatz + PeekS(@String + l1, len_rest)
EndMacro
; --------------------
time.s = ""
; Der Originalsatz
a$="Das war einmal der Satz"
Debug a$
Debug ""
; Das hier, weil ich zu faul zum selber Zaehlen bin
; und weil Änderungen ja später vom Prg. generiert werden könnten
lmax = Len(a$)
alt$ = "war einmal"
neu$ = "ist nun"
pos = FindString(a$,alt$)
laenge = Len(alt$)
; Ein Füllzeichen, wenn der Str. seine Länge behalten soll.
fuell$="."
; Nun der neue Satz 1, es ist laut Ausgabe der Schnellere
zeit = ElapsedMilliseconds()
For i=1 To 10000000
b$=ErsetzeString2(a$,pos,laenge,neu$)
Next
time + "Zeit 2 = " + Str(ElapsedMilliseconds() - zeit) + " ms" + #CRLF$
; Nun der neue Satz 2
zeit = ElapsedMilliseconds()
For i=1 To 10000000
ErsetzeString3(a$,pos,laenge,neu$)
Next
time + "Zeit 3 = " + Str(ElapsedMilliseconds() - zeit) + " ms" + #CRLF$
; Nun der neue Satz 3
zeit = ElapsedMilliseconds()
For i=1 To 10000000
ErsetzeString4(@a$, pos, laenge, neu$)
Next
time + "Zeit 4 = " + Str(ElapsedMilliseconds() - zeit) + " ms" + #CRLF$
; Nun der neue Satz 4
zeit = ElapsedMilliseconds()
For i=1 To 10000000
ErsetzeString5(@a$, pos, laenge, @neu$)
Next
time + "Zeit 5 = " + Str(ElapsedMilliseconds() - zeit) + " ms" + #CRLF$
MessageRequester("Zeiten", time)
Meine Zeiten sind:
Zeit 2 = 1585 ms
Zeit 3 = 1574 ms
Zeit 4 = 1090 ms
Zeit 5 = 811 ms