Seite 1 von 2
String Zeichen für Zeichen durch arbeiten
Verfasst: 01.05.2010 19:46
von Christian H
Ich such eine Möglichkeit einen String möglich schnell Zeichen für Zeichen abzuarbeiten.
Folgende Möglichkeiten habe ich bisher:
Code: Alles auswählen
Procedure test1(Text.s)
TAdr.i = @Text
For i = TAdr To TAdr+StringByteLength(Text)-1 Step #PB_Compiler_Unicode+1
temp.s = Chr(PeekC(i))
Next
EndProcedure
Procedure test2(Text.s)
For i = 1 To Len(Text)
temp.s = Mid(Text,i,1)
Next
EndProcedure
String.s = LSet("", 1000, "@")
StartTime1 = ElapsedMilliseconds()
For n = 1 To 1000
test1(String)
Next
EndTime1 = ElapsedMilliseconds()
StartTime2 = ElapsedMilliseconds()
For n = 1 To 1000
test2(String)
Next
EndTime2 = ElapsedMilliseconds()
MessageRequester("Zeit", "test1 = "+Str(EndTime1-StartTime1)+"ms"+#CRLF$+"test2 = "+Str(EndTime2-StartTime2)+"ms")
Warum sind beide Varianten im Unicode-Modus schneller als im ASCII-Modus?
Kennt jemand noch eine schnellere Möglichkeit?
Gruß Christian
Re: String Zeichen für Zeichen durch arbeiten
Verfasst: 01.05.2010 19:55
von Kaeru Gaman
Kennt jemand noch eine schnellere Möglichkeit?
arbeite mit einem strukturierten pointer vom typ Char.
direkten Zugriff auf das Zeichen erhältst du dann mit
natürlich musst du dann auch TAdr erhöhen um den String durchzuackern.
Re: String Zeichen für Zeichen durch arbeiten
Verfasst: 01.05.2010 19:57
von STARGÅTE
@Kaeru Gaman

der ist gut ^^ Typ Char ^^
Das Vieh heißt
Character !
Re: String Zeichen für Zeichen durch arbeiten
Verfasst: 01.05.2010 19:59
von Kaeru Gaman
du wirst lachen, Char ist schon seit langem ein gebräuchliches Hauptwort.
haben wir in C64 Zeiten schon zu nem Zeichen gesagt.
inzwischen sogar für Charaktere in Filmen und RPGs...
Re: String Zeichen für Zeichen durch arbeiten
Verfasst: 01.05.2010 20:01
von Pelagio
OHO, wieder zu langsam.
Ich würde die Schleifenart ändern um Geschwindigkeit zu bekommen:
Code: Alles auswählen
Procedure test3(Text.s)
Protected temp.s, tAdr.i = @text
While PeekC(tAdr)<>0
temp = Chr(PeekC(tAdr))
tAdr + 1
Wend
EndProcedure
Allerdings bin ich nicht so versiert wie Kaeru Gaman (Danke!) und STARGATE.
Re: String Zeichen für Zeichen durch arbeiten
Verfasst: 01.05.2010 20:33
von ts-soft
Code: Alles auswählen
Procedure Test3(Text.s)
Dim TextArray.c(Len(Text))
CopyMemory(@Text, @TextArray(0), StringByteLength(Text))
; zum testen entkommentieren
; For i = 0 To ArraySize(TextArray())
; Debug Chr(TextArray(i))
; Next
EndProcedure
Define.s Text = "Feel the ..Pure.. Power"
Test3(Text)
Re: String Zeichen für Zeichen durch arbeiten
Verfasst: 01.05.2010 20:58
von Christian H
Nach dem ich
Pelagios Version getestet habe und feststellte dass es erheblich schneller war als meine Lösungen war ich etwas Verwirrt.
Außer dass er While : Wend Schleife und ich For : Next Schleife verwende gibt es kein wesentlichen Unterschied. Also habe ich mir ForNext mal ein wenig genauer angeschaut und festgestellt dass bei jeden Durchlauf der Teil nach TO also <Ausdruck2> abgearbeitet wird. Hätte ich mal das Handbuch ganz gelesen.
So ist jetzt die Variante schnell genug für mich:
Code: Alles auswählen
Procedure test1(Text.s)
TAdr.i = @Text
TEnd.i = TAdr+StringByteLength(Text)-SizeOf(Character)
For i = TAdr To TEnd Step SizeOf(Character)
temp.s = Chr(PeekC(i))
Next
EndProcedure
Gruß Christian
PS:Jetzt bin ich beim schreiben unterbrochen worden. Muss ts-soft Variante noch testen
Re: String Zeichen für Zeichen durch arbeiten
Verfasst: 01.05.2010 21:53
von milan1612
Code: Alles auswählen
string.s = "test"
*current.Character = @string
While *current\c <> 0
Debug Chr(*current\c)
*current + SizeOf(Character)
Wend
Sollte die schnellste Moeglichkeit sein...
Re: String Zeichen für Zeichen durch arbeiten
Verfasst: 01.05.2010 21:53
von ts-soft
Christian H hat geschrieben:PS:Jetzt bin ich beim schreiben unterbrochen worden. Muss ts-soft Variante noch testen
Meine ist nur Komfortable, nicht schnell.
Die schnellen Routinen liegen bei mir so zwischen 135 und 138 ms.
Somit kann ich auch den Unterschied zwischen While Wend und For Next nicht bestätigen.
Hier noch meine schnelle Routine, aber nicht schneller als die von Pelagio, nur gleich.
Code: Alles auswählen
Structure char
c.c[0]
EndStructure
Procedure Test3(Text.s)
Protected *char.char
Protected i
Protected temp.s
*char = @Text
For i = 0 To Len(Text) - 1
temp = Chr(*char\c[i])
Next
EndProcedure
Aber ausser messen willste ja irgendwas machen, somit ist so ein Array wesentlich
praktischer als diese Peekerei
Gruß
Thomas
Re: String Zeichen für Zeichen durch arbeiten
Verfasst: 01.05.2010 23:03
von Christian H
@
ts-soft deine Array Variante ist bei mir schneller als die "Structure char"-Variante
@
milan1612 deine Variante ist in etwa der Vorschlag von Kaeru Gaman und in etwa genauso schnell unter Unicode wie meine letzte Variante.
Hier noch mal zum testen
Auf meinem Rechner haben test 1,3 und 4 125ms test 2 um die 1600ms.
Code: Alles auswählen
Procedure test1(Text.s)
; Christian H
TAdr.i = @Text
TEnd.i = TAdr+StringByteLength(Text)-SizeOf(Character)
For i = TAdr To TEnd Step SizeOf(Character)
temp.s = Chr(PeekC(i))
Next
EndProcedure
Structure char
c.c[0]
EndStructure
Procedure Test2(Text.s)
;ts-soft
Protected *char.char
Protected i
Protected temp.s
*char = @Text
For i = 0 To Len(Text) - 1
temp = Chr(*char\c[i])
Next
EndProcedure
Procedure Test3(Text.s)
; ts-soft Array Variante
Dim TextArray.c(Len(Text))
CopyMemory(@Text, @TextArray(0), StringByteLength(Text))
len.i = ArraySize(TextArray())
For i = 0 To len
temp.s = Chr( TextArray(i) )
Next
EndProcedure
Procedure Test4(Text.s)
; milan1612
*current.Character = @Text
While *current\c <> 0
temp.s = Chr(*current\c)
*current + SizeOf(Character)
Wend
EndProcedure
String.s = LSet("", 1000, "@")
StartTime1 = ElapsedMilliseconds()
For n = 1 To 1000
test1(String) ;Christian H
Next
EndTime1 = ElapsedMilliseconds()
StartTime2 = ElapsedMilliseconds()
For n = 1 To 1000
test2(String) ; ts-soft
Next
EndTime2 = ElapsedMilliseconds()
StartTime3 = ElapsedMilliseconds()
For n = 1 To 1000
test3(String) ; ts-soft Array Variante
Next
EndTime3 = ElapsedMilliseconds()
StartTime4 = ElapsedMilliseconds()
For n = 1 To 1000
test4(String) ; milan1612 / Kaeru Gaman
Next
EndTime4 = ElapsedMilliseconds()
message.s = "Christian H = "+Str(EndTime1-StartTime1)+"ms"+#CRLF$
message.s + "ts-soft = "+Str(EndTime2-StartTime2)+"ms"+#CRLF$
message.s + "ts-soft Array = "+Str(EndTime3-StartTime3)+"ms"+#CRLF$
message.s + "milan1612 = "+Str(EndTime4-StartTime4)+"ms"+#CRLF$
MessageRequester("Zeit", message.s)
; IDE Options = PureBasic 4.40 (Windows - x86)
; CursorPosition = 72
; FirstLine = 37
; Folding = -
; EnableUnicode
; DisableDebugger
Gruß Christian