auf Leerstring prüfen, gehts noch schneller ?

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
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

auf Leerstring prüfen, gehts noch schneller ?

Beitrag 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 ?
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Christi
Beiträge: 154
Registriert: 31.08.2004 14:17
Kontaktdaten:

Beitrag von Christi »

Code: Alles auswählen

If Not x$
edit: ahja, ich hab dich missverstanden. warum bloß?
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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?
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag 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
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag 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

Code: Alles auswählen

If PeekB(@x$)=0
  ;...
EndIf 
sollte so der Test wohl am schnellsten sein.

Gruß
Helle
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

Code: Alles auswählen

*temp.Character
    ;...
    *temp=@text
    If *temp\c
    EndIf
scheint wohl noch ein winziges stückchen schneller zu sein als

Code: Alles auswählen

    If PeekC(@text)
    EndIf
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten