Programm in Richtung Echtzeit bzw. Verzögerung optimieren

Alles rund um die Programmierung mit Qt
Antworten
archon
Beiträge: 117
Registriert: 22. August 2006 12:01

Programm in Richtung Echtzeit bzw. Verzögerung optimieren

Beitrag von archon »

Hallo Leute,

eine Frage wir haben ein C++ Programm das Qt nutzt ohne eine GUI. In
dem Programm laufen Algorithmen und auch andere Dinge (z.b. Loggen
von anfallenenden Daten in Files, auslesen von Schnittstellen von einem
Empfänger).

Nun die Frage:
Welche Maßnahmen gibt es generell um Programme so zu optimieren
damit sie weniger CPU Recourcen (Rechenzeit, CPU Last) benötigen?
Ich liste jetzt mal ein paar Sachen auf damit man weiss an was ich da gedacht habe:

Einfache Optimierungsmaßnahmen:

1. Optimierung von Windows (Indexdienst auschalten)
2. Schnelleres System anschaffen (CPU, schnelleren RAM, SSD)

Aufwändigere Maßnahmen:
1. Filezugriffe im Programm minimieren
2. Inline Funktionen verwenden
3. Qt Toolkit komplett verbannen (nur Ansi c, oder C++)
4. Mehrkernunterstützung implementieren
5. Rekursionen möglichst verwenden (contra schlechte Lesbarkeit)

Fallen jemanden weitere Dinge ein bzw. glaubt ihr diese Maßnahmen bringen nichts oder habt Einwände? Sicherlich bringen einige Vorschläge sehr viel und andere weniger bis garnichts.
Wer die Bibel liesst hört auf zu glauben
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Du meinst man sollte Rekursionen vermeiden, nicht verwenden, oder?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du solltest dir erst mal überlegen warum du überhaupt optimieren willst: Hast du ein konkretes Problem?

Dann solltest du mit einem passenden Tool raussuchen, wo du optimieren sollst. (Es macht keinen Sinn, einen Dateizugriff zu optimieren, der nur einmal kurz vorkommt)

1. Optimierung von Windows macht keinen Sinn, da man auf die Umgebung des Programmes nicht zugriff hat.
2. Ein schnelleres System ist keine Optimierung

1. Häufige Dateisystemzugriffe auf die gleichen Dateien werden vom Betriebssystem gecacht (zumindest von einem vernünftigen)
2. inline ist nur ein Hinweis für den Compiler.
3. Das sollte man sich vor dem Projekt und nicht während oder nach dem Projekt überlegen. Wobei Qt natürlich auch einige Optimierungen drinnen hat, die eine andere lib event. nicht hat.
4. Hängt von der Art der Aufgabe ab.
5. Warum sollte die Vermeidung/Verwendung von Rekursionen im allgemeinen Geschwindigkeit bringen?

Manchmal bringt auch die Verwendung eines anderen Algorithmuses einige Vorteile.
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Rekursionen ist halt so ne Sache. Du hast halt extrems viele und schnelle Funktionsaufrufe. Jeder Funktionsaufruf bringt ein gewisser Overhead mit.
Schreibst du die Rekursion aus, musst du mehr Variablen nutzen. Tauschst also Speicherplatz gegen Zeit.

Es kommt immer drauf an. Eine Schleife kann der Compiler ehr mal besser Optimieren als eine Rekursion IMO. Vorallen, wenn er erkennt, welche Daten als nächstes gebraucht werden, können die schonmal in den Cache geladen werden.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Es gibt mehrere Methoden, ein Programm zu optimieren. Was man in Deinem konkreten Fall machen soll, da fehlen einem die Infos zu. Wichtig iss natuerlich was du optimieren willst, und die konkrete Sachlage, warum der Wunsch entsteht. Danach iss man dann meist soweiso auf die Hilfe von spaziellen tools angeweisen (profiler), um die schwachstellen im code zu analysieren.

Weiterhin ... als programmierer bewegst dich immer zwischen Extremen, und die Wahrheit liegt immer mittendrinn. Man muss sie nur erkennen.

Beispiel: fuer max Performance und kontrolle ueber die ressourcen zu bekommen, wirst an manchen stellen sogar den c-compiler (den c++ compiler sowieso) austricksen muessen. Dann kannst auch gleich assembler schreiben. Mit dem noetigen wissen kommst damit der performantesten loesung schon sehr nah. Nur werden Dir triviale dinge dann tausende an entwicklerstunden kosten.
Der umgegehrte Fall iss wahrscheinlich sowas wie hochintelligente scriptsprachen ... mit wenigen zeilen code kannst komplette apps erstellen. Nur das laufzeitverhalten kann echt graesslich sein.

der erste Schritt der Optimierung isss immer einen gescheiten Kompromiss finden.
Und den code-Anteil zu finden, wo sich optimierung ueberhaupt lohnt.
3. Qt Toolkit komplett verbannen (nur Ansi c, oder C++)
Qt iss nicht per definition unperformant. qt implementiert eben nur bestimmte dinge auf ihre weisse. das muss nicht unbedingt optimal sein.

Kommst du zum Schluss, das dein ressourcenhandling inperformant iss, und willst da mehr einfluss drauf nehmen, wirst meist nicht drumherumkommen, die qt an gewissen stellen zu verbannen. (implizietes sharing ...etc).
viel ofter sind aber grundlegendere Dinge, also die grobe art und weise wie man manches implementiert, schaedlicher auf die Performance als ein bestimmtes toolkit ....

Ciao ...
archon
Beiträge: 117
Registriert: 22. August 2006 12:01

Beitrag von archon »

Schonmal vielen Dank für die vielen Kommentare. Ich seh schon es ist
ein größeres Thema und kann so man pauschaul auch nicht beantworten.

Es ist so das die Software eine Positionsberechnung durchführt mithilfe
von Daten von GPS Empfängern. Nun sind die Algorithmen schon etwas
aufwändiger (Filteralgorithmen (Kalman), Schätzalgorithmen). Aber das
Programm besteht ja nicht nur aus berechnungsalgorithmen sondern wird
das Programm auch die ganzen Daten in Dateinen loggen und da fallen
ein ganzen Haufen an Daten an (es werden 6 Files gleichzeitig
beschrieben). Rein Gefühlsmäßig würde ich vermuten das die mit QFile
und QTextStream durchgeführten Schreibzugriffe schon einen gewissen
Delay erzeugen könnten (nun etweder schreibzugriffe abschaffen, oder
über tcp schnittstelle?). Nun ist es auch so das die Software auch Serielle
Zugriffe durchführt (QExtSerialBase) auf den GPS Empfänger, diese
Lesezugriffe auf dem Buffer könnten auch Delays erzeugen
(Multithreading).

Ich würde eher ungern etwas am Algorithmus ändern da das sehr
aufwändig wäre (man müsste noch mal alles gegentesten, neu
spezifizieren) lieber wär uns noch mal über das Datenmanagement
drübergehen und organisatorische Änderungen durchführen.

Nur mal aus interesse was ist ein Profiler genau? Was kann die Software
leisten? Welche gibt es? Ich nutze im übrigen MVS (2003) unter Windows
XP.
Anliegen ist es die Software schneller laufen zu lassen d.h. statt das man
momentan einmal pro sekunde daten aus dem Empfänger ausliest und
die ganze Berechnung durchführt soll dies nun auch mit 25 mal /sec
funktionieren. Würde es ferner etwas bringen auf Linux umzusteigen (nur
so eine frage). Hat jmd Kommentare, Tipps? Vielen Dank im Vorraus
Wer die Bibel liesst hört auf zu glauben
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Nun, wie schnell liefert denn der GPS Empänger die Daten? Das ist aber nicht nur von der Baud Rate abhänig der Seriellen Schnittstelle. Wenn du nur 2 Satelitten empfängst kannst du halt weniger Daten lesen als bei 12.

Kannst du überhaupt von der Rechnerzeit her öfters als 1mal die Sekunde lesen, oder brauchen deine Algos so lange. Also 1 Sekunde.

Musst schon mehr erzählen.
archon
Beiträge: 117
Registriert: 22. August 2006 12:01

Beitrag von archon »

kater hat geschrieben:Nun, wie schnell liefert denn der GPS Empänger die Daten? Das ist aber nicht nur von der Baud Rate abhänig der Seriellen Schnittstelle. Wenn du nur 2 Satelitten empfängst kannst du halt weniger Daten lesen als bei 12.

Kannst du überhaupt von der Rechnerzeit her öfters als 1mal die Sekunde lesen, oder brauchen deine Algos so lange. Also 1 Sekunde.

Musst schon mehr erzählen.
Der Empfänger kann mit 25Hz die Daten rausschicken (ist ein spezieller Empfänger, binäres format kein nmea), auch ist es so je mehr Satelliten ich empfange desto mehr daten fallen natürlich an. Im Prinip sendet der GPS Empfänger u.a. die (Pseudo-) Entfernungen zu den Satelliten (double werte). Nun werden mit den einkommenden Daten die Positionsberechnung getriggert d.h. wenn neue daten reinkommen soll sofort eine neue pos berechnet werden, mitgeloggt werden etc. d.h. die software auf dem host rechner muss synchron mit der firmware vom receiver laufen so dass kein delay ensteht..soweit als hintergrundinfo
Wer die Bibel liesst hört auf zu glauben
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

d.h. die software auf dem host rechner muss synchron mit der firmware vom receiver laufen so dass kein delay ensteht
outsch ....
oder auch ned ^^

die frage, dein (GPS)Empfaenger, liefert der Dir Zeitstempel .. oder wirklich nur die reinen posi daten ???

Und wie genau brauchst du spaeter deine Aufzeichnungen ???

ohne zeitsempel kannst auf dem Comp ohne Echtzeit erweiterung und im usermode im guenstigsten fall max genauigkeiten von 100ms gewaehren.

D.h. im normalfall werden sie genauer sein, aber es koennen extremfaelle (ohne das der rechner einfriert) vorkommen wo diese abweichungen hasst.

willst das verhindern und die genauigkeit vorantreiben -> echtzeitBS
oder nen treiber im KernelMode zwischen der seriellen schnittstelle und deiner App ....

Hasst du Zeitstempel, musst alles nur korrellieren ... und kannst im userspace bleiben.

Also wie genau (in sachen zeitaufloesung) brauchst du es ?

Ciao ...
archon
Beiträge: 117
Registriert: 22. August 2006 12:01

Beitrag von archon »

RHBaum hat geschrieben:
d.h. die software auf dem host rechner muss synchron mit der firmware vom receiver laufen so dass kein delay ensteht
outsch ....
oder auch ned ^^

die frage, dein (GPS)Empfaenger, liefert der Dir Zeitstempel .. oder wirklich nur die reinen posi daten ???

Und wie genau brauchst du spaeter deine Aufzeichnungen ???

ohne zeitsempel kannst auf dem Comp ohne Echtzeit erweiterung und im usermode im guenstigsten fall max genauigkeiten von 100ms gewaehren.

D.h. im normalfall werden sie genauer sein, aber es koennen extremfaelle (ohne das der rechner einfriert) vorkommen wo diese abweichungen hasst.

willst das verhindern und die genauigkeit vorantreiben -> echtzeitBS
oder nen treiber im KernelMode zwischen der seriellen schnittstelle und deiner App ....

Hasst du Zeitstempel, musst alles nur korrellieren ... und kannst im userspace bleiben.

Also wie genau (in sachen zeitaufloesung) brauchst du es ?

Ciao ...
sry ich war im urlaub deswegen kann ich jetzt erst antworten... nur für den fall das dieser Thread noch weitergeführt wird:

Also die Grenzen sind 25 Hz und es sollte halt sichergestellt werden das die Positionsberechnung in 25 abläuft und es nicht vorkommen kann das zwischenrein das System abstürzt weil irgenwelche Prozesse CPU Recourcen benötigen. Mein Gedankengang ist demnach das man einen gewissen CPU Recourcenpuffer hat der die Überlastung des Systems ausschliesst. Es muss kein Echtzeitbetriebsystem sein wo man mit Schedulern arbeitet. Win Xp sollte reichen nur da der Code ziemlich spagettimäßig ist wollte ich eben über diese komplett drübergehen und mal optimierungen durchführen da die Software momentan eben nicht in mit der Anforderung lauffähig ist. So wie obige Leute schon vorgeschlagen haben, werde ich wohl erstmal die Übelstelle mit Tools oder per Hand herausfinden müssen worann es liegt. Wenn diese Stelle gefunden ist wird diese optimiert und neue Test werden gefahren.

Zum Thema Synron: Nun ja Syncron ist die Positionsberechnung nur dahingehend das diese von der Firmware (also von Receverdaten) getriggert wird. D.h: Die Daten kommen mit 25 Hz rein also in 40ms Abständen, was heisst dass das Programm maximal 40ms Zeit hat um die Position zu berechnen, Files zu schreiben etc und dannachzu warten. Manchmal kommen mehr Daten manchmal weniger.

Danke soweit
Wer die Bibel liesst hört auf zu glauben
Antworten