AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Tricks um Programm zu beschleunigen
Thema durchsuchen
Ansicht
Themen-Optionen

Tricks um Programm zu beschleunigen

Ein Thema von XeRo · begonnen am 19. Dez 2005 · letzter Beitrag vom 19. Dez 2005
Antwort Antwort
Seite 4 von 4   « Erste     234   
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#31

Re: Tricks um Programm zu beschleunigen

  Alt 19. Dez 2005, 12:44
Zitat von mumu:
Zitat:
Fehlerbehandlung selbst übernehmen. Try..Except ist eine Todesfalle schnellen Code.
soweit ich aber weiß ist das jedoch nur beim debug zeitpunkt so. in der runtime umgebung sollte ein try except nicht wirklich sehr performance schädigend sein, oder? ich mein der stack, lokale Variablen, und weitere informationen werden bei einer exception bei debuggen gesammelt und deshalb ist hier das programm langsamer, oder?
Auch zur Laufzeit ein echtes Problem. Weiß ich aus leidvoller, eigener Erfahrung. Besonders schlimm wird es, wenn die Exception auch noch regelmäßig ausgelöst wird.
Peter
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Tricks um Programm zu beschleunigen

  Alt 19. Dez 2005, 13:22
Ich will Dir ja nicht widersprechen, aber so gewaltig sind die Unterschiede nicht:
Delphi-Quellcode:
Var
  c,i : Cardinal;
  r : Real;

begin
  c := getTickCount;
  r := 0;
  For i:=1 to 20000000 do r:=r+r/i;
  memo.Lines.Add(intToStr (GetTickcount - c));
  c := getTickCount;
  r := 0;
  For i:=1 to 20000000 do try r:=r+r/i; except end;
  memo.Lines.Add(intToStr (GetTickcount - c));
end;
ergibt bei mir hier 500 und 620 (ca.) Ticks... Ob da was wegoptimiert wird, weiss ich nicht.

Allerdings, da geb ich Dir Recht, kommt man irgendwann dahin, das die 20% Performanceunterschied ein echtes Erfolgserlebnis sind: Wenn nämlich sonst kaum noch was rauszuholen ist.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#33

Re: Tricks um Programm zu beschleunigen

  Alt 19. Dez 2005, 13:47
Zitat von alzaimar:
Ich will Dir ja nicht widersprechen, aber so gewaltig sind die Unterschiede nicht:
Delphi-Quellcode:
Var
  c,i : Cardinal;
  r : Real;

begin
  c := getTickCount;
  r := 0;
  For i:=1 to 20000000 do r:=r+r/i;
  memo.Lines.Add(intToStr (GetTickcount - c));
  c := getTickCount;
  r := 0;
  For i:=1 to 20000000 do try r:=r+r/i; except end;
  memo.Lines.Add(intToStr (GetTickcount - c));
end;
ergibt bei mir hier 500 und 620 (ca.) Ticks... Ob da was wegoptimiert wird, weiss ich nicht.

Allerdings, da geb ich Dir Recht, kommt man irgendwann dahin, das die 20% Performanceunterschied ein echtes Erfolgserlebnis sind: Wenn nämlich sonst kaum noch was rauszuholen ist.
naja so in etwa hätte ich mir das auch vorgestellt. exceptions sind zwar (meiner meinung nach, die Indys haben da ja eine andere Meinung) unsaubere Programmierung und sollten eigentlich wirklich nur bei gravierenden Fehlern auftauchen, jedoch zur runtime nicht sehr performance schädigend.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Tricks um Programm zu beschleunigen

  Alt 19. Dez 2005, 14:56
Zitat von mumu:
exceptions sind zwar (meiner meinung nach, die Indys haben da ja eine andere Meinung) unsaubere Programmierung und sollten eigentlich wirklich nur bei gravierenden Fehlern auftauchen...
Wieso? Irgendwie muss man ja falsche Parameter ('Design by contract') ablehnen.
Variante A: Die Routinen liefern True, wenn alles im Lot sind und False sonst.
Delphi-Quellcode:
If EineProcedure Then
  If DieNaechsteProcedure Then
    If NochEineProcedure Then
      If EndlichDieLetzteProcedure Then
         Output ('Alles ok')
      else
        Output ('Hupsa')
    else
      Output ('Hupsa')
  else
    Output ('Hupsa')
else
  Output ('Hupsa');
Variante B: Die Routinen erzeugen eine Exception wenn irgendwas faul ist:
Delphi-Quellcode:
Try
  EineProcedure;
  DieNaechsteProcedure;
  NochEineProcedure;
  EndlichDieLetzteProcedure;
  Output ('Alles ok');
Except
  Output ('Hupsa');
End;
Also, ich finde 'B' übersichtlicher. Das einzige, was nervt, ist das Debuggen. Aber wenn man die Prozeduren spezielle Exceptions ('EMyException') auslösen lässt, kann man die auch wegfiltern.

Aber zurück zum Thema...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#35

Re: Tricks um Programm zu beschleunigen

  Alt 19. Dez 2005, 15:10
Dann testet doch mal eure Routinen, indem ihr alle 1000 Durchläufe eine Exception auslöst. Das dürfte ganz erhebliche Performance einbußen bringen. Baut doch einfach mal eine Division durch Null ein:
Delphi-Quellcode:
Var
  c,i : Cardinal;
  r : Real;

begin
  c := getTickCount;
  r := 0;
  For i:=1 to 20000000 do
  begin
    if (i div 1000) = (i/1000) then
      r := r
    else
      r:=r+r/i;
  end;
  memo.Lines.Add(intToStr (GetTickcount - c));
  c := getTickCount;
  r := 0;
  For i:=1 to 20000000 do
  begin
    try
      if (i div 1000) = (i/1000) then
        r := r / 0;
      else
        r:=r+r/i;
    except
    end;
  end;
  memo.Lines.Add(intToStr (GetTickcount - c));
end;
Habe das jetzt nicht bei mir geprüft, aber das Ergebnis sollte deutlich sein.

@alzaimar:
Hier gehts doch nicht um Übersichtlichkeit.
Peter
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#36

Re: Tricks um Programm zu beschleunigen

  Alt 19. Dez 2005, 15:14
Also letztendlich muss man ja des öfteren eine Entscheidung zwischen übersichtlichem Code und maximaler Geschwindigkeit treffen. Und bei exceptions nehme ich da Geschwindigkeitseinbußen gerne in Kauf.

Und Code, der mit der von dir beschriebenen Regelmäßigkeit Exceptions auslöst, macht IMHO sowieso was falsch. "Exception" heißt ja nicht umsonst "Ausnahme", und als solche sollte sie auch verstanden werden, nicht als reguläres Kommunikationsmittel. Dafür gibt es andere (schnellere!) Varianten.

// edit:
Zitat:
Hier gehts doch nicht um Übersichtlichkeit.
Vielleicht nicht direkt, im Kontext aber schon. Denn beim "Wegoptimieren" sollte man sich schon überlegen, ob der Geschwindigkeitsvorteil es jetzt tatsächlich wert ist, solchen Spaghetticode wie die verschachtelten Aufrufe (s.o.) in Kauf zu nehmen.

BTW: Wer kann denn einen einfach zu bedienenden (Freeware-)Profiler empfehlen?
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#37

Re: Tricks um Programm zu beschleunigen

  Alt 19. Dez 2005, 15:17
Zitat von alzaimar:
Zitat von mumu:
exceptions sind zwar (meiner meinung nach, die Indys haben da ja eine andere Meinung) unsaubere Programmierung und sollten eigentlich wirklich nur bei gravierenden Fehlern auftauchen...
Wieso? Irgendwie muss man ja falsche Parameter ('Design by contract') ablehnen.
Variante A: Die Routinen liefern True, wenn alles im Lot sind und False sonst.
Delphi-Quellcode:
If EineProcedure Then
  If DieNaechsteProcedure Then
    If NochEineProcedure Then
      If EndlichDieLetzteProcedure Then
         Output ('Alles ok')
      else
        Output ('Hupsa')
    else
      Output ('Hupsa')
  else
    Output ('Hupsa')
else
  Output ('Hupsa');
Variante B: Die Routinen erzeugen eine Exception wenn irgendwas faul ist:
Delphi-Quellcode:
Try
  EineProcedure;
  DieNaechsteProcedure;
  NochEineProcedure;
  EndlichDieLetzteProcedure;
  Output ('Alles ok');
Except
  Output ('Hupsa');
End;
Also, ich finde 'B' übersichtlicher. Das einzige, was nervt, ist das Debuggen. Aber wenn man die Prozeduren spezielle Exceptions ('EMyException') auslösen lässt, kann man die auch wegfiltern.

Aber zurück zum Thema...
ja alzaimar, das kann schon sein, aber ich hab ja geschrieben, dass das meine persönliche meinung ist mit den exceptions. ich find das einfach unschön bei sachen die man anders abfangen kann und im vornherrein bedacht hat, exceptions auslösen zu lassen.

naja muss im endeffekt jeder selbst wissen, ich finds aber schöner ohne exceptions, weil wenn nämlich dann welche auftreten, dann weiß ich bei meinem code 100 pro, dass ich da irgendwas nicht bedacht habe.
  Mit Zitat antworten Zitat
cruso
(Gast)

n/a Beiträge
 
#38

Re: Tricks um Programm zu beschleunigen

  Alt 19. Dez 2005, 15:20
Noch ein Tipp um ein Programm schnell zu halten:
Möglichst wenige Timer einbauen, da zu viele Timer das Programm ausbremsen (was vor allem am Betriebssystem liegt). Also nur wenige Timer (nur einen oder wenn möglich keinen) in das Programm integrieren!

MfG
Cruso
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#39

Re: Tricks um Programm zu beschleunigen

  Alt 19. Dez 2005, 15:29
Zitat von tigerman33:
Und Code, der mit der von dir beschriebenen Regelmäßigkeit Exceptions auslöst, macht IMHO sowieso was falsch. "Exception" heißt ja nicht umsonst "Ausnahme", und als solche sollte sie auch verstanden werden, nicht als reguläres Kommunikationsmittel. Dafür gibt es andere (schnellere!) Varianten.
Das war der Grund, warum ich schon vorher irgendwann mal geschrieben hatte, dass man die Fehlerbehandlung selbst übernehmen sollte und nicht mit Exception-Handling. Natürlich kann man es trotzdem für unerwartete Fehler verwenden. Das mache ich auch. Aber in Schleifen damit zu arbeiten und Fehler einzuplanen, um diese in einer Exception abzuarbeiten ist ungeschickt. Das ist aber ein "typischer" Anfängerfehler: "Exceptions sind Klasse. Man braucht sich um nichts mehr kümmern...".
Darum so ausführlich.
Peter
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Tricks um Programm zu beschleunigen

  Alt 19. Dez 2005, 16:22
(Mein) letztes Wort zu exceptions, den Ausnahmen: Da sie ausnahmsweise auftreten, kann man die Geschwindigkeitseinbußen, die dann auftreten, ruhig in Kauf nehmen. jasoculs Code weiter oben zeigt, das eine einzelne Exception ca. doppelt so langsam wie die Abfrage per Hand ist.

Grundsätzlich ist klar, das man Exceptionbehandlung nicht zur Flusskontrolle nehmen sollte, also z.B. so (aber nicht lachen)
Delphi-Quellcode:
Done := False;
Repeat
  Try
    DoSomething;
    If Finished Then Abort;
  Except
    Done := True;
  End;
Until Done;
Nebenbei: Mein Beispielcode sollte doch nur mal demonstrieren, das der Overhead einer Try-Finally Behandlung bei ca. 20% liegt, wenn's *nicht* schiefgeht. Da man Exceptions ja für die Ausnahmen (ja Alz, das wissen wir jetzt ) verwendet, kann man die imho ruhigh im Code lassen, da es die Performance naturgemäß nur marginal beeinflusst.

Gott-Sei-Dank spielt die Programmiersprache (der alte K(r)ampf Delphi vs. C) beim Optimieren keine Rolle mehr. Nur Assembler bringt bei bestimmten rechenintensiven Geschichten noch die eine oder andere Sekunde, aber dann ist auch Schluss.

Ich kann jedem nur empfehlen, ein Gefühl für die Komplexität eines Verfahrens zu bekommen. Oben erwähntes Beispiel für die JPEG-Berechnung zeigt, das man mit 1x Nachdenken Berge versetzen kann.

Einen Punkt (ca. 10% Gewinn) hab ich noch: Rekursion vermeiden.

Ein hübsches Beispiel, wie im Team ein Problem performancetechnisch eingedampft werden kann, zeigt dieser Thread: Es ging um Primzahlen.
http://www.delphi-forum.de/viewtopic...er=asc&start=0

Hier gings um Stringkonvertierungen:
http://www.delphi-forum.de/viewtopic.php?t=46537

Und hier ums Sortieren von GB großen Textdateien:
http://www.delphi-forum.de/viewtopic...718&highlight=

So, zum Schmöckern...
"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 4 von 4   « Erste     234   


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 21:41 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