![]() |
length(s) = 0 ODER s = '' ?
Was sollte man besser benutzen, um zu prüfen ob ein String leer ist?
length(s) = 0 oder s = '' Ich würde auf der erste tippen, da dies ein Vergleich von zwei Integerwerten ist, der wohl schneller abläuft als ein String-Vergleich. ODer gibt es keinen Unterschied da der Compiler s = '' automatisch in eine performante Entsprechung umwandelt? |
Re: length(s) = 0 ODER s = '' ?
Ich wuerde auf zweiteres tippen, schliesslich muss beim ersten ja die Laenge berechnet werden. ;)
Greetz alcaeus |
Re: length(s) = 0 ODER s = '' ?
Ich würde auf ersteres tippen, schliesslich weiss ein AnsiString um seine Länge.
|
Re: length(s) = 0 ODER s = '' ?
Ich würde einen Haltepunkt setzen und dort das CPU-Fenster öffnen.
Grüße vom marabu |
Re: length(s) = 0 ODER s = '' ?
Folgender kleiner Test:
Delphi-Quellcode:
Ergebnis (ohne Gewähr):
var
str1, str2: String; StartTime: array[0..1] of Cardinal; EndTime: array[0..1] of Cardinal; i: integer; begin str1 := ''; str2 := 'Hallo, das ist ein kleiner, wenngleich doch etwas längerer Test-String.'; StartTime[0] := GetTickCount(); for i := 1 to 1000000000 do begin if str1 = '' then ; if str2 = '' then ; end; EndTime[0] := GetTickCount(); StartTime[1] := GetTickCount(); for i := 1 to 1000000000 do begin if Length(str1) = 0 then ; if Length(str2) = 0 then ; end; EndTime[1] := GetTickCount(); ShowMessage('Vergleich mit leerem String: ' + FloatToStr((EndTime[0] - StartTime[0]) / 1000) + ' Sekunden,'#13#10 + 'Vergleich über Length(): ' + FloatToStr((EndTime[1] - StartTime[1]) / 1000) + ' Sekunden'); Vergleich mit leerem String: etwa 1,5 bis 1,8 Sekunden Vergleich über Length(): etwa 4 bis 4,3 Sekunden :angel: |
Re: length(s) = 0 ODER s = '' ?
Ok, die Haltepunktmethode sagt es am besten aus:
Bei einem Vergleich auf einen leeren String erzeugt der Compiler einen Code der direkt und sofort nachschaut ob der String leer ist (Vergleich ob <> Nil, da EmptyStr im Normalfall Nil ist). Bei der Abfrage mit Length ruft er wirklich noch LStrLen auf - welcher zwar sofort selbiges feststellt und zurück kehrt, aber er ruft die Funktion nunmal auf - was es langsamer macht. Also ein Vergleich auf einen Leerstring ist ein "Einzeiler" - somit schneller. |
Re: length(s) = 0 ODER s = '' ?
kommt auf den Verwendungszweck an, mein Vorschlag:
Length(Trim(s)) = 0 falls nämlich ein Leerzeichen drin steht das aber genauso als leer angesehen werden soll wird das gleich mit abgezogen und auch ' ' gilt dann als leer |
Re: length(s) = 0 ODER s = '' ?
Zitat:
|
Re: length(s) = 0 ODER s = '' ?
dann ist
if Trim(s) = '' then denoch schneller als if Length(Trim(S)) = 0 then Length() ist nunmal ein normaler Funktionsaufruf und der einfache Vergleich = '' eher als Compilermagic anzusehen. Gruß Hagen |
Re: length(s) = 0 ODER s = '' ?
Drüber hinaus ist ein String mit einem Leerzeichen streng genommen nicht als leer anzusehen. Das ist dann schon wieder vom Kontext abhängig. Keinesfalls aber eine allgemein zu treffende Aussage ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz