Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Optimierung des Codes (https://www.delphipraxis.net/95883-optimierung-des-codes.html)

Svenkan 15. Jul 2007 10:41


Optimierung des Codes
 
Hey Leute!
Folgendes: in meiner ganzen Zeit hier habe ich einiges von euch gelernt, wofür ich euch auch sehr danke!
Nun stehe ich aber vor einem Problem, dass sich nennt: Performance!
Ich war immer so toll und habe für alles was ich mehrfache brauchte, einfach immer alles dupliziert (bspw. Timer). Was nun so einiges an bestimmt überflüssigen Code hergibt.
Da ich für 5 Tage meine Pläne jeweils ausgebe, habe ich dafür auch 5 versch. Timer, die alle 10sec die HTML-Pläne erstellen.
Dann wäre da noch ein Timer zum Aktualisieren der Daten (jede Sekunde) und 2 für den Upload nach x Min (Lehrer- und Schülerpläne getrennt; jeweils einzeln deaktivierbar im Programm).
Insg. komme ich auf eine Größe der Exe von 1.36MB, wo ich hier im Forum auch schon drüber lesen konnte, dass selbst 1MB schon ziemlich groß sein soll.
Das hat mich jetzt zum Nachdenken gebracht und wollte von euch wissen, wie man effektiv optimieren kann und welche Möglichkeiten sich mir da bieten. :)

Phoenix 15. Jul 2007 10:49

Re: Optimierung des Codes
 
Zitat:

Zitat von Svenkan
Insg. komme ich auf eine Größe der Exe von 1.36MB, wo ich hier im Forum auch schon drüber lesen konnte, dass selbst 1MB schon ziemlich groß sein soll.

Also wir liefern .exen mit 9 - 12 MB aus. In der Firma wo ich vorher war, hatte die Exe ganze 22 MB. Also stör Dich da mal nicht dran, sofern Du das Programm nicht unbedingt mit möglichst keinen Downloads vertreiben willst.

Flare 15. Jul 2007 10:53

Re: Optimierung des Codes
 
Zitat:

Zitat von Svenkan
Hey Leute!
Nun stehe ich aber vor einem Problem, dass sich nennt: Performance!

Inwiefern besteht ein Performanceproblem? Ein großes Programm muss ja nicht heißen, dass es langsam ist.


Flare

Svenkan 15. Jul 2007 10:58

Re: Optimierung des Codes
 
@ Phoenix: Ah, von dir war das also die Diskussion über die 22MB-MB exe. :)
Genau deswegen kam ich auf diese Optimierungsgeschichte. :)
Naja ok. ;)
Aber es geht dann auch noch im die Programm-Performance, da mein Programm doch des Häufigeren mal ins Stocken gerät, wenn irgendwie 5 Timer gleichzeitig insg. 13 Dateien schreiben und währenddessen alle 5 Sekunden die Daten aus der dbf geholt werden sollen.
Besonders für die Planerstellung such ich noch eine bessere Alternative, um nicht immer 5 Timer gleichzeitig laufen zu lassen und den Code zu dezimieren (evtl Templates?).

Phoenix 15. Jul 2007 11:02

Re: Optimierung des Codes
 
Mit Stocken meinst Du wohl, dass das Programm nicht mehr so flüssig reagiert wie es sollte?

Da würde ich dann eher vorschlagen, die Ein- und Ausgaberoutinen mit den Dateizugriffen in Threads auszulagern, so dass diese den Haupthread mit der Oberfläche nicht mehr blockieren können.

Svenkan 15. Jul 2007 11:05

Re: Optimierung des Codes
 
Zitat:

Zitat von Phoenix
Mit Stocken meinst Du wohl, dass das Programm nicht mehr so flüssig reagiert wie es sollte?

Genau!

Zitat:

Zitat von Phoenix
Da würde ich dann eher vorschlagen, die Ein- und Ausgaberoutinen mit den Dateizugriffen in Threads auszulagern, so dass diese den Haupthread mit der Oberfläche nicht mehr blockieren können.

Zum Auslesen: da habe ich gerade etwas seeeehr Überflüssiges gefunden, was noch aus 'alten Tagen' drin war. Habs entfernt und schonma 0.1MB gespart. :D
Aber trotzdem hört sich das mit den Threads natürlich sehr interessant an.
Hast du da irgendwie ein Tutorial o.Ä. was du mir empfehlen könntest?

Phoenix 15. Jul 2007 11:07

Re: Optimierung des Codes
 
Such mal auf Luckie seiner Homepage, da hat er ein paar sehr gute Tutorials.

jfheins 15. Jul 2007 11:07

Re: Optimierung des Codes
 
Die Frage, die du dir stelen solltest ist, ob du wirklich (soviele) Timer benötigst ;)

Falls es eine Möglichkeit gibt, festzustellen wann eine Aufgabe erledigt werden muss, ist das in fast jedem Fall einer Polling-basierten Lösung vourzuziehen ...

Zum Beispiel: Warum musst du alle 10 sek. einen neuen HTML-Plan erstellen? Warum kannst du den nicht nur neu erstellen, wenn er geändert wurde?

Timer werden häufig in Zusammenhang mit dem sog. Polling eingesetzt, und Polling ist für fast kein Problem die beste Lösung ...

Das Gegenteil/bessere wäre eine Ereignisbasierte Lösung, wie ich sie oben beschrieben habe, so macht Windows auch vieles: Ein Fesnter wird nur neugezeichnet, wenn ein Ereignis eintritt, das das erfordert, die Nachrichtenschleife wird nur angestoßen, wenn eine Message da ist (in den meisten Programmen) usw.

Der_Unwissende 15. Jul 2007 12:44

Re: Optimierung des Codes
 
Hi,

auch das Schreiben von 13 Dateien gleichzeitig klingt nicht ganz optimal. So eine Festplatte (denke mal auf die wird geschrieben) arbeitet am Effektivsten, wenn sie große Datenmengen schreibt/liest. Du hast immer eine gewisse Zeit, die vergeht um eine Datei zu suchen (Position ermitteln, Köpfe in Pos. fahren, warten bis Datum unter Kopf). Wurde die Datei erstmal gefunden, kannst Du sehr sehr große Datenmengen ziemlich flink Schreiben. Dank Cache und verschiedenen Optimierungen fällt hier selbst bei kleinen Mengen die Zugriffszeit noch recht gering aus. Wirklich gleichzeitig kannst Du aber keine 13 Dateien schreiben (außer Du hast 13 Festplatten, am besten mit 13 Bussen..). Jedenfalls heißt in dem Fall gleichzeitig schreiben, dass immer abwechselnd ein Stück in jede Datei geschrieben wird. Das Problem ist dabei dann der Wechsel zwischen den Dateien, der kostet unnötig Zeit.
Besser ist es, wenn Du hier einfach eine Datei nach der anderen schreibst. Noch besser, Du verwendest sogar noch einen kleinen Schreibpuffer, sammelst also im Hauptspeicher erstmal bestimmte Mengen von Daten, die Du in eine Datei schreiben willst und schreibst erst dann, wenn eine bestimmte Menge erreicht ist. Wie gut das jeweils möglich ist, hängt natürlich vom Programm ab.

Gruß Der Unwissende

alzaimar 15. Jul 2007 12:58

Re: Optimierung des Codes
 
I.A. reicht ein einziger "Timer", also eine Instanz, die zeitgesteuert irgendwelche Aufgaben erledigt. Ich würde einen Thread verwenden, der ein Liste von Jobs abarbeitet. Jeder Job wird zu einem bestimmten Zeitpunkt ausgeführt. So reicht es, wenn der Thread 1x pro Sekunde (z.B.) nachschaut, ob der nächste auszuführende Job 'schon dran' ist.

Ein periodisch auftretender Job kann 'sich selbst' dann -nachdem er abgearbeitet ist- selbst wieder in die Jobliste des Threads einfügen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 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