![]() |
Funktion optimieren
Hallo,
Ich habe folgende Funktion, die sehr oft aufgerufen wird und wüsste gerne, ob man die irgendwie optimieren kann mit ASM oder so.
Delphi-Quellcode:
Danke
function TestFunc(const s: String): Boolean; Inline;
var i, l: Integer; begin Result := True; l := Length(s); if l <> 32 then begin Result := False; Exit; end; for i := 1 to l do if not (s[i] in ['0'..'9', 'A'..'f', 'a'..'f']) then begin Result := False; Break; end; end; MfG |
Re: Funktion optimieren
Wie kommen denn die Strings in dein Programm? Wie oft wird die Funktion aufgerufen? Kannst du nicht schon bei der Eingabe für diese Konfiguration sorgen?
|
Re: Funktion optimieren
Delphi-Quellcode:
:wiejetzt:
for i := 1 to l do
|
Re: Funktion optimieren
Zitat:
|
Re: Funktion optimieren
Zitat:
|
Re: Funktion optimieren
Zitat:
Delphi-Quellcode:
Das sollte (denke ich) schneller sein, da es die Set-Behandlung umgeht, die sich intern auf vergleichsweise riesige Datenstrukturen stützt. Wie Delphi deinen Code genau umsetzt, weiß ich allerdings nicht.
function TestFunc(const s: String): Boolean; Inline;
var i, l: Integer; c: char; begin Result := True; l := Length(s); if l <> 32 then begin Result := False; Exit; end; for i := 1 to l do begin c := s[i]; if (c <= '0' and c >= '9') or (c <= 'A' and C >= 'F') or (c <= 'a' and c >= 'f') then begin Result := False; Break; end; end; end; |
Re: Funktion optimieren
Zitat:
Sehr oft. Die Datei(en) können schonmal mehrere Tausend Zeilen haben. Nein. |
Re: Funktion optimieren
Für die For-Schleife fällt mir keine Abkürzung ein. Auch ASM wird da nicht mehr viel nützen. So schlecht ist der Delphi-Compiler nicht, dass man mit ASM noch etwas rausholen könnte. Du könntest noch den Aufruf der length-Funktion rausnehmen indem du direkt
Delphi-Quellcode:
abfragts, was allerdings eine AV gibt, wenn s leer ist. Ob das allerdings wirklich ein Zeitgewinn ist, weis ich nicht.
if pcardinal(integer(s)-4)^ <> 32 then
[rote Kästen]@Dax Deine For-Schleife dürfte auf Grund der vielen Verglieche deutlich länger dauern. So ein Set geht schneller. |
Re: Funktion optimieren
Erstmal Danke für die vielen Antworten.
@OldGrumpy Ja es war ein Tippfehler :wink: Uppercase und Lowercase bringt aber leider nicht wirklich was. @dax Bei deiner Methode ist irgendwas falsch (E2015 Operator ist auf diesen Operandentyp nicht anwendbar) |
Re: Funktion optimieren
Zitat:
Zitat:
Ich finde das hier (getestet, ca 2x) schneller:
Delphi-Quellcode:
Du musst einmalig eine Lookuptabelle erstellen ('InitComparison') und dann diese verwenden. Alternativ kannst Du natürlich das Array als 'CONST' deklarieren.
Var
FraudChars : Array [Char] Of Boolean; Procedure InitComparison; Var c : Char; Begin FillChar (FraudChars, SizeOf(FraudChars),0); for c:='0' to '9' do FraudChars[c] := True; for c:='a' to 'f' do FraudChars[c] := True; for c:='A' to 'F' do FraudChars[c] := True; End; function TestFunc(const s: String): Boolean; Inline; var i, l: Integer; c: char; begin Result := True; l := Length(s); if l <> 32 then begin Result := False; Exit; end; for i := 1 to l do begin If FraudChar [s[i]] Then Begin Result := False; Break; end; end; end; Lookuptabellen sind eigentlich immer schneller (eigentlich = Ausnahmen bestätigen die Regel). Bei solchen Problemen ist es immer wieder interessant, die Dinge auszutesten, weil man mit den Überlegungen häufig daneben liegt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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