![]() |
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:
Funktion 2:
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;
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 ? |
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.
|
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. |
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 :) |
Re: Faszination Stringlist und Zeichen zählen
Hai Sharky
Zitat:
Gruss |
Re: Faszination Stringlist und Zeichen zählen
Zitat:
|
Re: Faszination Stringlist und Zeichen zählen
Hallo,
Zitat:
Wenn man hingegen Result erst am Schluss verwendet, steht eax in der gesamten Funktion zur Verfügung. Gruß xaromz |
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?
|
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) |
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