Vorsicht Performance-Falle

Zu viele geöffnete Fenster

Jedes Fenster, jedes Objekt und jede zusätzliche Einstellung in TrainController kostet - und zwar Rechenzeit. Manche Anwender unterliegen aber dennoch dem Irrtum, alles sei „gratis“ zu haben.

Es kommt dann häufiger vor, dass Anwender eine Vielzahl überflüssiger Fenster geöffnet haben. Oft sind es Lokführerstände, von denen dann 10, 20 oder gar mehr ebenso aufwändiges wie weitgehend sinnfreies Kino am Bildschirm veranstalten.

Und Anwender wundern sich dann, wenn TrainController irgendwann langsam reagiert.

Die eigentliche Aufgabe von TrainController besteht darin, den Betrieb auf der Modellbahn zu steuern. Die Bildschirmanzeige ist eigentlich zweitrangig. Zu viele unnötig geöffnete Fenster können aber Rechenleistung binden, die dann anderswo für wichtige Dinge fehlt. Dies gilt insbesondere für Lokführerstände und viele gleichzeitig fahrende Loks

Die Anzahl der gleichzeitig geöffneten Fenster (egal ob sichtbar oder verborgen !) sollte das absolut benötigte Mindestmaß nicht übersteigen. Wozu 20 Lokführerstände? Gibt es eine Notwendigkeit, überhaupt einen Lokführerstand dauerhaft geöffnet zu halten?

Wenn man eine bestimmte Lok beobachten möchte, so kann man schnell einen Führerstand öffnen, die Lok darin auswählen und verfolgen.

Möchte man sich das Öffnen sparen und immer wieder mal eine Lok mit der Hand steuern, so reicht dafür ein einziger ständig geöffneter Führerstand. Wussten Sie übrigens, dass man zumindest in TrainController Gold Lokfunktionen auch über das Hauptmenü ohne einen Lokführerstand schalten kann?

Wenn TrainController langsam reagiert, sollten Sie über das Register Fenster auf jeden Fall einmal prüfen, wie viele Fenster gerade geöffnet (sichtbar und verborgen) sind. Achten Sie dabei besonders auf eine vermeidbar hohe Anzahl von Lokführerständen, weil dies besonders oft falsch gemacht wird.

Endlosschleifen in Operationen

Mit folgender Endlosschleife in den Operationen von TrainController Gold kann man TrainController gut ausbremsen:

Marke Anfang: \\
... Operationen ... \\
Abfrage Schleifende? \\
Sprung nach Ende. \\
Sprung nach Anfang. \\
Marke Ende: \\
... \\

Wird die Schleife zwischen der Marke „Anfang“ und der Abfrage des Schleifendes über einen langen Zeitraum hinweg viele Male wiederholt, so entsteht eine spürbare Last. Manchmal werden sogar Endlosschleifen, die über die gesamte Sitzung laufen sollen, so programmiert.

Bei solchen Schleifen sollte auf jeden Fall vor dem Rücksprung zum Schleifenbeginn eine angemessene Verzögerung eingefügt werden. Dies gilt insbesondere für beabsichtigte Endlosschleifen.

Also etwa so:

Marke Anfang:
… Operationen …
Abfrage Schleifende?
Sprung nach Ende.
Verzögerung 2000
Sprung nach Anfang.
Marke Ende:
…

Das wirkt bereits Wunder! Und gerade in Endlosschleifen ist dies unverzichtbar.

In zukünftigen Versionen wird folgende Absicherung eingebaut:

Wird in derselben Operationsliste der Sprung zu einer bestimmten Marke innerhalb eines bestimmten (kurzen) Zeitraums zu oft wiederholt, so wird die Ausführung der Operationsliste abgebrochen und eine Fehlermeldung im Meldungsfenster ausgegeben. Will man dies verhindern so muss man entweder die Anzahl der Schleifendurchläufe verringern oder eine angemessene Verzögerung zwischen zwei Durchläufen einfügen.

Unendlich oft wiederholter Start von Zugfahrten

Ein Anwender möchte am Anfang der Sitzung 10 beliebige Züge aus einem Schattenbahnhof ausfahren lassen, in dem 50 Züge bereitstehen.

Dazu startet er am Anfang der Sitzung in einer Schleife oder durch einen mehrfach ausgelösten Bahnwärter mehrfach die für die Schattenbahnhofsausfahrt ohne Angabe eines Zuges. Die wird so oft gestartet, bis zehn (beliebige) Züge losgefahren sind.

Dazu wird bei jedem erfolgreichen Start der ein Zähler (z.B. in einer ) um eins hochgezählt. Erreicht der Zähler 10, wird die nicht mehr gestartet.

Alles richtig gemacht?

Nein!

Wehe nämlich, wenn sich die am Anfang aus welchem Grund auch immer gar nicht starten lässt! Dann ergibt sich möglicherweise eine wunderbare Endlosschleife, weil der Zähler ja nicht hochgezählt wird. Und bei jedem Schleifendurchlauf wird 50 mal (vergeblich) versucht, die mit je einem der 50 bereitstehenden Züge zu starten.

Dies kann sehr schnell zu tausenden vergeblichen Startversuchen führen und sogar das Programm fast lahmlegen. Wir haben gerade erst vor kurzem dieses Szenario bei einem Anwender beobachtet.

Wenn man also solch einen mehrmals wiederholten Startversuch einer mit möglicherweise vielen bereitstehenden Zügen programmiert, so muss im Abbruchkriterium für die Wiederholungen nicht nur die Anzahl erfolgreicher Starts geprüft werden, sondern ob die auch überhaupt einmal erfolgreich gestartet werden konnte.

Also im obigen Beispiel nach einem Start der prüfen, ob der Zähler 0 ist oder mindestens 10. In beiden Fällen dann abbrechen.

In einer zukünftigen Version wird dies so abgesichert, dass der Start einer ohne Angabe von Zügen für eine gewisse Zeit gesperrt wird, wenn eine bestimmte Zahl von Versuchen innerhalb einer bestimmten Zeitspanne fehlgeschlagen ist. Der Start von mit Vorgabe eines bestimmten Zuges ist hiervon nicht betroffen.

Original-Beitrag: https://www.freiwald.com/forum/viewtopic.php?f=5&t=38371