![]() |
Re: Tricks um Programm zu beschleunigen
Zitat:
|
Re: Tricks um Programm zu beschleunigen
Ich will Dir ja nicht widersprechen, aber so gewaltig sind die Unterschiede nicht:
Delphi-Quellcode:
ergibt bei mir hier 500 und 620 (ca.) Ticks... Ob da was wegoptimiert wird, weiss ich nicht.
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; 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. |
Re: Tricks um Programm zu beschleunigen
Zitat:
|
Re: Tricks um Programm zu beschleunigen
Zitat:
Variante A: Die Routinen liefern True, wenn alles im Lot sind und False sonst.
Delphi-Quellcode:
Variante B: Die Routinen erzeugen eine Exception wenn irgendwas faul ist:
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');
Delphi-Quellcode:
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.
Try
EineProcedure; DieNaechsteProcedure; NochEineProcedure; EndlichDieLetzteProcedure; Output ('Alles ok'); Except Output ('Hupsa'); End; Aber zurück zum Thema... |
Re: Tricks um Programm zu beschleunigen
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:
Habe das jetzt nicht bei mir geprüft, aber das Ergebnis sollte deutlich sein.
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; @alzaimar: Hier gehts doch nicht um Übersichtlichkeit. :lol: |
Re: Tricks um Programm zu beschleunigen
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:
BTW: Wer kann denn einen einfach zu bedienenden (Freeware-)Profiler empfehlen? :?: |
Re: Tricks um Programm zu beschleunigen
Zitat:
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. |
Re: Tricks um Programm zu beschleunigen
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 |
Re: Tricks um Programm zu beschleunigen
Zitat:
Darum so ausführlich. |
Re: Tricks um Programm zu beschleunigen
(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:
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 :stupid: ) verwendet, kann man die imho ruhigh im Code lassen, da es die Performance naturgemäß nur marginal beeinflusst.
Done := False;
Repeat Try DoSomething; If Finished Then Abort; Except Done := True; End; Until Done; 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. ![]() Hier gings um Stringkonvertierungen: ![]() Und hier ums Sortieren von GB großen Textdateien: ![]() So, zum Schmöckern... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 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