Seite 1 von 2
auf Leerstring prüfen, gehts noch schneller ?
Verfasst: 21.10.2007 14:27
von hjbremer
Da man manchmal prüfen muß ob ein String leer ist, habe ich mir bei einer zeitkritischen Routine überlegt wie man es besser machen kann als mit TRIM(x$)=""
Code: Alles auswählen
x$=""
max=10000000
a=GetTickCount_()
For j=1 To max
If Trim(x$)=""
EndIf
Next
b=GetTickCount_()
MessageRequester("",Str(b-a ))
a=GetTickCount_()
;um Faktor 10-20 schneller, je nach Länge des Strings
;ohne Debugger getestet, mit Debugger sind die Unterschiede nicht so groß
For j=1 To max
If PeekB(@x$)='' ;dies sind 2 Hochkommas, bei mir oben auf der # Taste
EndIf
Next
b=GetTickCount_()
MessageRequester("",Str(b-a ))
Gehts noch schneller ?
Verfasst: 21.10.2007 14:39
von Christi
edit: ahja, ich hab dich missverstanden. warum bloß?
Verfasst: 21.10.2007 14:57
von edel
Benutze Zeiger, die sind um Laengen schneller als Funktionen.
Ich verstehe dein Beispiel allerdings ueberhaupt nicht, welchen
Sinn macht es x-mal einen Stringanfang auf ein Leerzeichen zu
pruefen?
Verfasst: 21.10.2007 18:48
von hjbremer
zum einen das x-mal ist für den Geschwindigkeitstest, sonst bekommt man ja immer null.
zum Anderen, kann man in vielen Fällen davon ausgehen, das, wenn das 1.Zeichen leer ist, der ganze String leer ist.
z.B. du fragst einen Namen ab. Im Feld steht ein Name oder kein Name, sondern nur Leerzeichen.
a$="HJBREMER " oder a$=" HJBREMER" oder a$=" " oder a$=""
aber da man nicht weiß ob nun nichts oder Leerzeichen, muß man halt TRIM benutzen.
IF TRIM(a$)=""
... tue irgendwas
else
... tue irgendwas
endif
und leider ist die TRIM Funktion wie fast alle String Befehle langsam. So prüfe einmal 10000 Namen.
Und wenn ZEIGER schneller sind als PEEKB, wie wärs mit einem Beispiel.
Verfasst: 21.10.2007 19:05
von #NULL
kannst ja das mal testen ob es schneller ist:
Code: Alles auswählen
Procedure whiteSpaceOnly(s.s)
Static *c.Character
*c = @s
While *c\c
If Not (*c\c=32 Or *c\c=9)
ProcedureReturn #False
EndIf
*c+SizeOf(Character)
Wend
ProcedureReturn #True
EndProcedure
Verfasst: 21.10.2007 20:28
von Helle
Wenn es ein echter Leerstring (also mit Länge Null) ist, enthält er immer noch das string-abschliessende Byte mit dem Wert Null (nicht die Ziffer!).
Mit
sollte so der Test wohl am schnellsten sein.
Gruß
Helle
Verfasst: 21.10.2007 20:34
von AND51
Warum PeekB() ?
Gibt es PeekC() nur zur Deko?
PeekC() ist doch sehr viel besser geeignet, vor allem weil man damit auch mit Unicode arbeiten kann.
Verfasst: 21.10.2007 21:08
von hjbremer
Hallo #null
leider ist deine Routine um Lichtjahre zu langsam. Faktor 10 zu Trim
Trotzdem Danke für die Mühe
grüße hjbremer
AND51 hat recht, wer UniCode braucht muß PEEKC nehmen und ist genauso schnell wie PEEKB
Verfasst: 21.10.2007 21:38
von #NULL
scheint wohl noch ein winziges stückchen schneller zu sein als
Verfasst: 21.10.2007 22:07
von AND51
Ja, weil PeekC() eine Prozedur ist. Irgendwo hier im Forum hab ich mal gehört, dass der Prozessor 4 Schritte tun muss, um eine Prozedur durchzufühen. Diese Schritte kann man sich beim Pointern sparen. Ich hoffe, das war so richtig @ all?