Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi length(s) = 0 ODER s = '' ? (https://www.delphipraxis.net/65042-length-s-%3D-0-oder-s-%3D.html)

BlueStarHH 11. Mär 2006 12:58


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?

alcaeus 11. Mär 2006 13:02

Re: length(s) = 0 ODER s = '' ?
 
Ich wuerde auf zweiteres tippen, schliesslich muss beim ersten ja die Laenge berechnet werden. ;)

Greetz
alcaeus

Muetze1 11. Mär 2006 13:05

Re: length(s) = 0 ODER s = '' ?
 
Ich würde auf ersteres tippen, schliesslich weiss ein AnsiString um seine Länge.

marabu 11. Mär 2006 13:09

Re: length(s) = 0 ODER s = '' ?
 
Ich würde einen Haltepunkt setzen und dort das CPU-Fenster öffnen.

Grüße vom marabu

KingIR 11. Mär 2006 13:12

Re: length(s) = 0 ODER s = '' ?
 
Folgender kleiner Test:
Delphi-Quellcode:
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');
Ergebnis (ohne Gewähr):
Vergleich mit leerem String: etwa 1,5 bis 1,8 Sekunden
Vergleich über Length(): etwa 4 bis 4,3 Sekunden

:angel:

Muetze1 11. Mär 2006 13:15

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.

Angel4585 11. Mär 2006 20:25

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

BlueStarHH 11. Mär 2006 20:55

Re: length(s) = 0 ODER s = '' ?
 
Zitat:

Zitat von Angel4585
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

Wie Du aus den oberen Postings erkennen kannst, sollte statt Length besser = '' benutzt werden. In Deinem Fall also Trim(s) = '' wenn man es wirklich braucht. Trim bei jedem Vergleich einfach so einzufügen halte ich für nicht sinnvoll.

negaH 11. Mär 2006 20:56

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

dizzy 12. Mär 2006 03:37

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 06:03 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz