![]() |
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. |
Re: Funktion optimieren
Hi alzaimar,
Deine Methode ist zwar sehr schnell, aber sie funktioniert (bei mir) nicht. :? Hab das "InitComparison" im Formcreate Ereignis eingefügt und die procedure ersetzt und es kommt immer als Result "False" raus. //Edit: Habs, du hattest ein "not" vor FraudChars vergessen. |
Re: Funktion optimieren
Moin moin,
die Zuweisung zu L kann doch weggelassen werden...
Delphi-Quellcode:
//..
if Length(s) <> 32 then begin Result := False; Exit; end; for i := 1 to 32 do //.. |
Re: Funktion optimieren
Hallo Dax,
dieser Ausdruck ist falsch. Die Bedingung zum Rausfliegen ist schon erfüllt wenn c ausserhalb '0' bis '9' liegt.
Delphi-Quellcode:
Grüsse
if (c <= '0' and c >= '9') or (c <= 'A' and C >= 'F') or (c <= 'a' and c >= 'f') then
Rainer |
Re: Funktion optimieren
Hi xtZ,
Hier nochmal eine Zusammenfassung (Fehler bereinigt, Optimierungen der Anderen eingebaut):
Delphi-Quellcode:
Var
FraudChars : Array [Char] Of Boolean; Procedure InitComparison; Var c : Char; Begin For c:=low(Char) To High (Char) Do FraudChars[c] := True; for c:='0' to '9' do FraudChars[c] := False; for c:='a' to 'f' do FraudChars[c] := False; for c:='A' to 'F' do FraudChars[c] := False; End; function TestFunc(const s: String): Boolean; Inline; var i : Integer; begin Result := True; if Length(s) <> 32 then Result := False else for i := 1 to 32 do If FraudChar [s[i]] Then Begin Result := False; Break; end; end; end; |
Re: Funktion optimieren
Hallo,
so verstehts auch jeder:
Delphi-Quellcode:
Grüsse
function TestFunc(const s: String): Boolean; Inline;
var i : Integer; begin Result := True; if Length(s) <> 32 then Result := False else for i := 1 to 32 do If FraudChar [s[i]] Then Begin Result := False; Break; end; end; Rainer |
Re: Funktion optimieren
Zitat:
Wobei man ja geteilter Meinung über die Formatierung sein kann, gelle? |
Re: Funktion optimieren
Richtig, alzimar. Das Einzige, was man vielleicht noch anders schreiben kann/möchte/sollte/haben/sein wäre diese Ecke:
Delphi-Quellcode:
Ich würde entweder die Anweisung hinten ans Then anhängen, oder das Then vor die Anweisung runterziehen, damit in 5 Jahren keiner auf die Idee kommt, da noch was hinzufrickeln.
if Length(s) <> 32 then
Result := False
Delphi-Quellcode:
@ws1976: nich böse sein, aber bei Deiner Schreibweise würde ich nie wissen, ob jetzt genügend ends da sind und wenn ja, ob sie an der richtigen Stelle sitzen.
if Length(s) <> 32 then Result := False
// oder if Length(s) <> 32 then Result := False |
Re: Funktion optimieren
Zitat:
Delphi-Quellcode:
if Length(s) <> 32 then
begin Result := False; end { if Length(s) } else begin for i := 1 to 32 do begin if FraudChar [s[i]] then Begin Result := False; Break; end; { if FraudChar } end; { for i } end; { else if Length(s) } |
Re: Funktion optimieren
Ein kleines Quentchen (JA, alte Rechtschreibung, das Wort hat wohl überhaupt nichts mit Quant zu tun :P) kann man wohl noch einsparen indem man sich die Zuweisung "Result:=True" am Anfang spart und nur ausführt wenn die Länge passt, da ansonsten eh gleich wieder Result:=False gesetzt wird. Also ab damit in den Else-Zweig :)
|
Re: Funktion optimieren
Hallo,
wenn wir schon dabei sind, Zuweisungen zu vermeiden, dann gleich richtig:
Delphi-Quellcode:
Wobei es hier ja um Geschwindigkeit geht, und die Zuweisung von Result das eax-Register blockiert. Deshalb sollte Result eigentlich nur am Ende der Funktion gesetzt werden. Das darf aber jemand anderes machen...
function TestFunc(const s: String): Boolean; Inline;
var i: Integer; begin Result := False; if Length(s) = 32 then begin for i := 1 to 32 do if FraudChar [s[i]] then Exit; Result := True; end; end; Gruß xaromz |
Re: Funktion optimieren
Und schon wieder wird der Borland-Styleguide nicht beachtet. :warn:
Ich red mir hier in verschiedenen Threads den Mund fusselig und jeder schreibt weiterhin den Code, wie er es für richtig hält. :-( |
Re: Funktion optimieren
Hallo,
Zitat:
Verwunderte Grüße xaromz |
Re: Funktion optimieren
Zitat:
Richtig. Niemand schreibt Dir vor, Dich an (irgendeinen) Styleguide zu halten. Aber wenn man das vernünftig betrachtet sollte man es tun. Und ich habe kein Problem. Nur kommt mir jedesmal die Galle hoch, wenn ich sowas in dieser Art sehe:
Delphi-Quellcode:
Aus diesem Grund würde Jemand, der MEINEN Styleguide (der auf dem Borland Styleguide basiert) in MEINER Abteilung permanent missachtet, erst eine Abmahnung und dann die Kündigung erhalten.
for i := 1 to 32 do
if FraudChar [s[i]] then Exit; Result := True; |
Re: Funktion optimieren
Hallo,
Zitat:
Zitat:
Zitat:
Gruß xaromz |
Re: Funktion optimieren
Zitat:
Zitat:
|
Re: Funktion optimieren
Zitat:
Ich minimiere z.B. die Verwendung von Begin..End, arbeite dafür aber mit Leerzeilen. Ich mach das seit 20 Jahren so und mein Code ist ganz schön lesbar. Wem er nicht gefällt, schnappt sich einen Format-O-Maten und -wupps- hatta wassa will. Im Übrigen ist das sowas von OT, das es fast schon lustig wird. |
Re: Funktion optimieren
Ja, schon gut.
Es geht schon wieder. Soll doch jeder seinen Code schreiben wie es ihm beliebt. Ich reg mich dann im Stillen darüber auf und schreibe vielleicht noch ne PN. Ausserdem hab ich mit der StyleGuiderei nicht angefangen, es war Sidorion. :???: |
Re: Funktion optimieren
Zitat:
|
Re: Funktion optimieren
Zitat:
:cheers: ein :love: oder ein :kiss: oder gar ein :sharkylinchen: wird. Das lassen wir doch lieber sein. :roll: So genug offtopic. Schnell wieder zurück zum eigentlichen Thema. |
Re: Funktion optimieren
Hallo,
Object-Pascal ist doch ein so schön strukturierte Sprache. Ich versteh nicht wie man da so ein Durcheinander fabrizieren kann. Auch ohne Styleguide gibts da eigentlich gar kein Problem. Das einzige Problem das ich sehe sind die C'ler, die meinen mit Gewalt ihren Guidestyle durchzusetzen. Grüsse Rainer |
Re: Funktion optimieren
Hallo
Als reiner Delphianer: Styleguides sind sehr wichtig und essentiell! Es ist die einzige Überlebensstrategie um in Projkete die Wartbarkeit für die Zukunft zu sichern! Desweiteren hängt die Qualität von Software sehr stark mit der "visuellen Qualität" von Sourcecode zusammen. Was passiert wenn Leute das Projekt verlassen und andere weiteremachen ? Wenn jeder seinen eigenen Stil einbringt, so daß andere nicht damit umgehen können so mag das für den Augenblick funktionieren aber nicht für die Zukunft. |
Re: Funktion optimieren
Gähn. DelForExp, JEDI-Code-Formatter, Gregs Formatter, etc. Wo ist euer Problem? Da einigt man sich auf irgendeine Einstellung und zieht die durch.
|
Re: Funktion optimieren
Zitat:
Deswegen kriegt in MEINER Abteilung jeder den Kopf abgerissen, der sowas macht (aber nicht von mir, sondern vom Chef :twisted: ). Aber wie gesagt: Es war nur ein Gefahrenhinweis, nicht aber eine Styleguidediskussion, weil wir eben in freier Wildbahn sind. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 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