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.
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$)=""
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
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?
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
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
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?