Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Faszination Stringlist und Zeichen zählen (https://www.delphipraxis.net/106157-faszination-stringlist-und-zeichen-zaehlen.html)

Ghostwalker 6. Jan 2008 10:35


Faszination Stringlist und Zeichen zählen
 
Einfach aus einer Laune heraus hab ich mal 2 Funktionen geschrieben, die mir die Anzahl der Zeichen (ohne Zeilenumbruch) in einer Stringlist ausgeben.


Funktion 1:

Delphi-Quellcode:
function GetCharCountInList(AList:TStrings):int64;
var
  i : integer;

begin
  result := 0;
  for I := 0 to Alist.count - 1 do
    result := result+length(alist.strings[i]);
end;
Funktion 2:

Delphi-Quellcode:
function GetCharCountInList2(AList:TStrings):Int64;
begin
  result := length(Alist.Text)-((alist.count)*2);
end;

Eigentlich sollte man doch meinen, das Funktion 2 wesentliche schneller ist, als Funktion 1 (selbstredend ohne Optimierung des Compilers !).

Pustekuchen. Funktion 1 ist um Längen schneller (gemessen bei 100000 Aufrufen).

Kann mir das mal bitte einer erklären ?

BenjaminH 6. Jan 2008 10:40

Re: Faszination Stringlist und Zeichen zählen
 
AList.text setzt erstmal alle einzelnen Strings zusammen, dafür wird speicher reserviert, usw. das braucht einiges an Zeit.

Sharky 6. Jan 2008 10:41

Re: Faszination Stringlist und Zeichen zählen
 
Hai Ghostwalker,

ein Grund dürfte wohl sein das die Eigenschaft .Text von TStrings erst beim Zugriff über die Gettermethode GetTextStr zusammen gesetzt wird (und das jedes mal wenn man .Text ausliest!). Auch dort wird in einer Schleife über alle Strings gegelaufen und diese werden zu einem zusammen gesetzt.

BTW: Wenn Du in deiner ersten Funktion nicht jedesmal den Wert von Result änderst sonder alles mit einer Variablen in machst und diese erst zum schluss dem Funktionsergebniss zuweisst dürfte das ganze noch etwas schneller werden.

Ghostwalker 6. Jan 2008 10:44

Re: Faszination Stringlist und Zeichen zählen
 
Interessant.....da könnte man doch glatt mal überlegen, eine etwas...optimiertere Variante der Stringlist zu bauen. :mrgreen:


Danke erstmal für eure Antworten :)

thkerkmann 6. Jan 2008 11:19

Re: Faszination Stringlist und Zeichen zählen
 
Hai Sharky

Zitat:

Zitat von Sharky

BTW: Wenn Du in deiner ersten Funktion nicht jedesmal den Wert von Result änderst sonder alles mit einer Variablen in machst und diese erst zum schluss dem Funktionsergebniss zuweisst dürfte das ganze noch etwas schneller werden.

:wiejetzt: kannst Du das bitte mal erklären, wo da der Unterschied sein soll ? Meines Erachtens ist result auch nur eine "Variable" auf dem Stack. Wo soll denn da der Geschwindigkeitsunterschied her kommen ?

Gruss

Dax 6. Jan 2008 11:31

Re: Faszination Stringlist und Zeichen zählen
 
Zitat:

Zitat von thkerkmann
:wiejetzt: kannst Du das bitte mal erklären, wo da der Unterschied sein soll ? Meines Erachtens ist result auch nur eine "Variable" auf dem Stack. Wo soll denn da der Geschwindigkeitsunterschied her kommen ?

Genauer gesagt ist es hier sogar eine Variable in einem Register, da kann man an Geschwindigkeit nichts mehr gewinnen ;)

xaromz 6. Jan 2008 12:10

Re: Faszination Stringlist und Zeichen zählen
 
Hallo,
Zitat:

Zitat von Dax
Zitat:

Zitat von thkerkmann
:wiejetzt: kannst Du das bitte mal erklären, wo da der Unterschied sein soll ? Meines Erachtens ist result auch nur eine "Variable" auf dem Stack. Wo soll denn da der Geschwindigkeitsunterschied her kommen ?

Genauer gesagt ist es hier sogar eine Variable in einem Register, da kann man an Geschwindigkeit nichts mehr gewinnen ;)

kann man eben doch. Result ist quasi der Delphi-Variablenname für das Register eax. Wenn man in der Funktion nun Result verwendet, wird dieses Register blockiert und muss bei einem Funktionsaufruf (z. B. Length) auf dem Stack gesichert und danach wieder geladen werden. Das kostet Zeit.

Wenn man hingegen Result erst am Schluss verwendet, steht eax in der gesamten Funktion zur Verfügung.

Gruß
xaromz

Dax 6. Jan 2008 12:14

Re: Faszination Stringlist und Zeichen zählen
 
Ich bin bisher davon ausgegangen, dass Delphi alle verfügbaren Register nutzt.. Tut es das nicht und benennt Result notfalls für die Funktion in EDX um, weil das eben immer frei ist, zum Beispiel?

sirius 6. Jan 2008 12:19

Re: Faszination Stringlist und Zeichen zählen
 
Darf ich mal bei eurem Disput kurz einhaken?

1. Hier wird als Result:int64 benutzt. Da reicht nicht ein Register.
2. Ist auch Delphi so schlau, und legt u.U Result auf den Stack, wenn es sein muss (hier ist es so)

thkerkmann 6. Jan 2008 12:26

Re: Faszination Stringlist und Zeichen zählen
 
Hi,

@Xaraomz:
ich habs mir mal im CPU Window angeschaut... Schätze weil das Funktionsergebnis als int64 deklariert ist trifft deine Annahme nicht zu. Die beiden Varianten sind ziemlich identisch. Egal ob result oder eine variable verwendet wird.

Könnte sein wenn's nur normaler integer wäre.

Gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 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