![]() |
Re: Funktionsaufruf: Dauert immer länger. Warum?
Zitat:
Trotzdem ist es natürlich besser, eher einmal zu viel anzufordern als mehrmals stückchenweise. EDIT: @Go2EITS: Strings sind, wie alle dynamischen Arrays, sowieso intern Pointer auf dem Stack, die auf irgendeinen Bereich auf dem Heap zeigen. Wenn du da was mit Pointern machst, ist das intern genau das gleiche, nur schwerer zu lesen. |
Re: Funktionsaufruf: Dauert immer länger. Warum?
@3_of_8
Bin mir da nicht so sicher, ob es mit Pointern manchmal doch schneller geht... :gruebel: Vielleicht, weil man dann maschinennäher programmiert? |
Re: Funktionsaufruf: Dauert immer länger. Warum?
Das kann man so allgemein nicht sagen. Du kannst auch in Assembler langsamen Code programmieren. Delphi verwaltet Strings intern auch einfach als Pointer auf den Heap. Anders kannst du es auch nicht machen.
|
Re: Funktionsaufruf: Dauert immer länger. Warum?
Liste der Anhänge anzeigen (Anzahl: 3)
Ich habe die Version von Christian einfach mal probeweise mit der Mengenabfrage probiert.
Und das Ergebnis ist, 145 ms zu 45ms mit der Mengenabfrage! So sieht der momentan schnellste Code aus:
Delphi-Quellcode:
Tabelle schlägt Menge ist hiermit wiederlegt. Mit FastMM4 und FastMove.pas gibt es nochmals einen Geschwindigkeitsschub.
function ClearStr4(const Str: string): String;
const ValidChars = ['a'..'z','A'..'Z','ä','ö','ü','Ä','Ö','Ü','ß',' ']; var i,x,count: Integer; begin if Str = '' then Exit; result:= ''; count:= 1; SetLength(Result, Length(Str)); for i:= 1 to Length(Str) do begin if str[i] in ValidChars then //Hier fragen wir die Menge ab. begin Result[Count]:= Str[i]; Inc(Count); end; end; SetLength(result, Count-1); end; Im Anhang die einzelnen Exen und den Source incl. der Exen beigefügt. [Edit: Move.pas heißt FastMove.pas und //Break... aus Source entfernt] |
Re: Funktionsaufruf: Dauert immer länger. Warum?
Ich würde noch die impliziten Aufrufe von UniqueString unterdrücken indem ich diese Automatik durch Pointer aushebele. Damit komme ich auf ca. 20ms:
Delphi-Quellcode:
function ClearStr5(const Str: string): String;
const ValidChars = ['a'..'z','A'..'Z','ä','ö','ü','Ä','Ö','Ü','ß',' ']; var i, Len: Integer; CurIn, CurOut: ^Char; begin Len := Length(Str); SetLength(Result, Len); CurIn := Pointer(Str); CurOut := Pointer(Result); for i := 1 to Len do begin if CurIn^ in ValidChars then begin CurOut^ := CurIn^; Inc(CurOut); end; Inc(CurIn); end; SetLength(Result, Integer(CurOut) - Integer(Pointer(Result))); end; |
Re: Funktionsaufruf: Dauert immer länger. Warum?
Zitat:
Zitat:
Zitat:
|
Re: Funktionsaufruf: Dauert immer länger. Warum?
@Janicke
Was Pointer, richtig eingesetzt, bewirken können. Das Ergebnis und die vorhergehenden Vorschläge sind sehr lehrreich und wohl auch für andere DP'ler interessant. Vielen Dank! |
Re: Funktionsaufruf: Dauert immer länger. Warum?
Es hilft zur Optimierung oft in den generierten Assemblercode zu schauen. Ich wusste das ja nun schon, aber wenn man da nachschaut, dann sieht man, dass bei jedem Zugriff auf ein Zeichen UniqueString aufgerufen wird, wenn man normale Strings benutzt.
Mit PChar wie jbg sagte kann man das genauso verhindern, da diese Automatik nur bei Delphi-Strings passiert, deshalb ist das natürlich besser, wenn du das noch entsprechend änderst. Der Grund für den Aufruf von UniqueString ist, dass Delphi (in 4 Byte beginnend 8 Byte vor dem Beginn des Strings, auf den der Pointer in der String-Variable zeigt) bei Strings einen Referenzzähler mitführt, der die Anzahl der Referenzen auf den String zählt um den String bei 0 verbleibenden Referenzen freizugeben. Deshalb wird bei jeder Veränderung des Strings mit UniqueString sichergestellt, dass man nicht einen anderweitig referenzierten String verändert. Und das eben bei jedem Zeichen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 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