AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion optimieren

Ein Thema von xtZ · begonnen am 3. Okt 2007 · letzter Beitrag vom 4. Okt 2007
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
xtZ

Registriert seit: 22. Jul 2007
21 Beiträge
 
#1

Funktion optimieren

  Alt 3. Okt 2007, 20:50
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:
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;
Danke

MfG
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Funktion optimieren

  Alt 3. Okt 2007, 21:24
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?
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#3

Re: Funktion optimieren

  Alt 3. Okt 2007, 21:30
for i := 1 to l do
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Funktion optimieren

  Alt 3. Okt 2007, 21:32
Zitat von Mackhack:
for i := 1 to l do
Das eine is ne Eins und das andere is ein "L". Passt schon soweit ich das überblicke
Julian J. Pracht
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Funktion optimieren

  Alt 3. Okt 2007, 21:32
Zitat von xtZ:
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:
function TestFunc(const s: String): Boolean; Inline;
[...]
  if not (s[i] in ['0'..'9', 'A'..'f', 'a'..'f']) then
[...]
Danke

MfG
Da hätte ich schonmal ne schöne Optimierung, benutze 'A'..'F' statt 'A'..'f' (Tippfehler?). Ausserdem könnte man mal schauen ob ein Aufruf von Uppercase() schneller ist als die Variante mit zwei Buchstabenmengen und in-Operator.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: Funktion optimieren

  Alt 3. Okt 2007, 21:33
Zitat von Mackhack:
for i := 1 to L do
Delphi-Quellcode:
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 <= '0and c >= '9') or (c <= 'Aand C >= 'F') or (c <= 'aand c >= 'f') then
    begin
      Result := False;
      Break;
    end;
  end;
end;
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.
  Mit Zitat antworten Zitat
xtZ

Registriert seit: 22. Jul 2007
21 Beiträge
 
#7

Re: Funktion optimieren

  Alt 3. Okt 2007, 21:33
Zitat von Nikolas:
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?
Ich lese zum Beispiel eine Datei zeilenweise ein und prüfe jede Zeile mit dieser Funktion.
Sehr oft. Die Datei(en) können schonmal mehrere Tausend Zeilen haben.
Nein.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Funktion optimieren

  Alt 3. Okt 2007, 21:39
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
if pcardinal(integer(s)-4)^ <> 32 then abfragts, was allerdings eine AV gibt, wenn s leer ist. Ob das allerdings wirklich ein Zeitgewinn ist, weis ich nicht.


[rote Kästen]@Dax
Deine For-Schleife dürfte auf Grund der vielen Verglieche deutlich länger dauern. So ein Set geht schneller.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
xtZ

Registriert seit: 22. Jul 2007
21 Beiträge
 
#9

Re: Funktion optimieren

  Alt 3. Okt 2007, 21:48
Erstmal Danke für die vielen Antworten.

@OldGrumpy
Ja es war ein Tippfehler
Uppercase und Lowercase bringt aber leider nicht wirklich was.

@dax
Bei deiner Methode ist irgendwas falsch (E2015 Operator ist auf diesen Operandentyp nicht anwendbar)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Funktion optimieren

  Alt 3. Okt 2007, 21:56
Zitat von Dax:
Das sollte (denke ich) schneller sein,
Nö, eher langsamer.
Zitat von Dax:
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.
Findest Du 8 Bytes pro Set 'riesig'?

Ich finde das hier (getestet, ca 2x) schneller:
Delphi-Quellcode:
Var
  FraudChars : Array [Char] Of Boolean;

Procedure InitComparison;
Var
  c : Char;

Begin
  FillChar (FraudChars, SizeOf(FraudChars),0);
  for c:='0to '9do FraudChars[c] := True;
  for c:='ato 'fdo FraudChars[c] := True;
  for c:='Ato 'Fdo 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;
Du musst einmalig eine Lookuptabelle erstellen ('InitComparison') und dann diese verwenden. Alternativ kannst Du natürlich das Array als 'CONST' deklarieren.

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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz