Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++: Speichermodell

Der Performanztest

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Die Performanzunterschiede der verschiedenen thread-sicheren Singleton Patterns sind enorm.
04:16

Transkript

Bei so vielen Thread-sicheren Singleton-Implementierungen stellt sich natürlich die Frage: Welche ist die schnellste aller Implementierungen Genau dieser Frage, gehe ich in dieser Lektion nach. Hier zu meinem Test. In meinem Test starte ich vier Threads. In diesem Fall verwende ich futures, bzw. "promise" dafür In jedem promise führe ich die Funktion getTime aus. 1, 2, 3, 4 getTime, was macht das? getTime ruft 10 Millionen mal MySingleton: :getInstance() auf. Und was ich hier einfach tue, ist die Zeit zusammenaddieren, die es benötigt, um 10 Millionen mal MySingleton: :getInstance aufzurufen. Hier unten addiere ich dann alle vier Zeiten der vier Threads zusammen und gebe sie hier aus. Ich fasse meinen Test noch einmal zusammen Je vier Threads greifen 10 Millionen mal auf ein Singleton zu. Ich lasse den Test auf meinem PC, der läuft unter Linux, laufen Mein PC besitzt vier Kerne. Und auf meinem Laptop, das besitzt aber nur zwei Kerne. Ich addiere die Zeiten der vier Threads zusammen. Und zum Einsatz kommt eine aktuelle GCC und Visual Studio 15. Ich führe diesen Test mit maximal und ohne Optimierung aus. Als Referenzwert dient mir die Single-Threaded Ausführung. Das heißt, wenn ich meine vier Threads zusammenaddiere, ist die Frage wie nah sie an die Single-Threaded Ausführungszeit rankommen. Hier meine Ergebnisse. Was lässt sich schön aus der Tabelle ablesen? Hier sehen Sie die verschiedenen Implementierungen meines Singleton-Patterns Single-Threaded mit lock_guard. Sequenzielle Konsistenz Aquire-Release-Semantik und Meyers Singleton. Hier die verwendeten Compiler, bzw. Plattformen. GCC mit, ohne. cl.exe mit und ohne Optimierung der Windows-Compiler. Welche Erkenntnisse können aus dieser Tabelle abgeleitet werden? Erstens: cl.exe und GCC verhalten sich reativ ähnlich. Das ist mal beruhigend. Zweite Erkenntnis: Optimierung zahlt sich aus. Zwischen dem nicht-optimierten und dem optimierten Verhalten liegt in diesem Fall ungefähr Faktor 20. Dann, das Meyers-Singleton ist mit Abstand das schnellste. Das heißt, deutlich schneller, wie die Implementierung im double-checked locking-Pattern. Die Implementierung mit der Sequenziellen Konsistenz und mit der Aquire-Release-Semantik Die Meyers-Singleton kommt fast an die Laufzeit der Single-Threaded-Ausführung ran. Sie sehen es. Also ist es nah am Optimum dran. Die mit Abstand langsamste Implementierung ist der standard lock_guard. Zum Abschluss will ich noch auf meinen Blog-Artikel hinweisen. Den habe ich hier verlinkt, wo ich noch weitere Implementierungen des Singleton-Patterns, des Thread-saven Singleton-Patterns umgesetzt und auf Performance gemessen habe. Nun will ich noch ein paar Schlussfolgerungen ziehen. Meine erste Schlussfolgerung ist, das Singleton Pattern weckt viele Emotionen. Was meine ich damit? Das Singleton Pattern hat einen legendären Ruf aus dem einfachen Grund, weil es viele Entwickler viel zu häufig einsetzen. Und von daher, gibt es eine kontroverse Diskussion, ob man das Singleton Pattern überhaupt verwenden soll. Ich finde aber, für diesen Anwendungsfall, den ich hatte, ist das Singleton Pattern ideal. Mein Anwendungsfall war, ich hatte den Anwendungsfall, dass ich eine Variable nur einmal schreiben will, aber sehr, sehr oft lesen will. Und nur das Schreiben soll Thread-sicher sein. Und, was weiter sehr interessant war, war der Optimierer, sowohl der von GCC wie auch der von cl.exe, war sehr aggressiv. Der hat mir meine MySingelton: :getInstance Aufrufe wegoptimiert, da er gesehen hat, dass ich das Singleton-Objekt nicht verwenden werde. Ich musste mir dann dadurch helfen, dass ich eine volatile-Variable eingeführt habe. Und das ist meine Haupterkenntnis aus der ganzen Performance-messerei. Das Meyer-Singleton ist mit Abstand das schnellste und mit Abstand die einfachste Implementierung. Das finde ich eine sehr schöne Erkenntnis. In dieser Lektion hab ich die verschiedenen Thread-sicheren Singleton-Implementierungen gegenübergestellt. Und insbesondere ihre Performance gemessen.

C++: Speichermodell

Verstehen und nutzen Sie die Konzepte und die zugrundeliegenden TEchnolgien des Speichermodells in C++.

1 Std. 29 min (29 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:24.11.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!