Wir erleben ein seltsames Phänomen, bei dem die Einbeziehung einer Header-Datei zu einer 5-10% igen Leistungseinbuße bei bestimmten speicherzuordnungsintensiven Arbeitslasten führt.Performance-Kosten von Threading-Konstrukten: verpasste Optimierungen und Speicherzuweisung
Diese Header-Datei deklariert einen Thread-Pool als globale Variable. Dieser Threadpool wird (noch) nie in der Anwendung verwendet. Das heißt, abgesehen von der Erstellung dieses statischen Threadpools beim Programmstart ist die Anwendung vollständig single-threaded. Die Leistung Strafe verschwindet, sobald der Header entfernt wird.
Aus ein wenig Forschung, scheint es wie eine Multithread-Anwendung kann einige Leistungseinbußen aufgrund bestimmter Compiler-Optimierungen nicht mehr möglich sein. Ist es möglich, dass solche Optimierungen ausgeschaltet werden, wenn ein Threading-bezogenes Konstrukt in irgendeiner Form oder Kapazität instanziiert wird?
Oder, da die Leistungseinbußen bei der Ausführung zahlreicher Speicherzuordnungen am offensichtlichsten zu sein scheinen, ist es möglich, dass der Compiler während der Kompilierungs-/Verknüpfungsphase erkennt, dass Threadingkonstrukte instanziiert werden und somit zu einem Thread-sicheren Speicherzuordner wechselt ?
Dies geschieht auf einer Linux 64-Bit-Workstation mit GCC und Clang. Die Standard-Threading-Primitive aus C++ 11 werden verwendet.
EDIT Ich sollte auch erwähnen, dass, nach unseren Tests, bei der Verwendung der Tcmalloc Allocator anstelle der Standard, scheint der Leistungsunterschied weg.
das ist eigentlich faszinierend. Sind Sie in der Lage, ein kleines kompilierbares Beispiel zu veröffentlichen, um das Phänomen zu demonstrieren? –
Ändern sich die Objektdateien neben den hinzugefügten Variablen? – user2864740
Umfasst diese "Erstellung eines statischen Thread-Pools beim Programmstart" Speicherzuweisungen in Haupt- und/oder Arbeitsthreads? –