Ich versuche, einen Leistungsunterschied zwischen der Verwendung von Boost.Variant und der Verwendung virtueller Schnittstellen zu messen. Angenommen, ich möchte verschiedene Typen von Zahlen gleichmäßig erhöhen, indem ich Boost.Variant verwende. Ich würde eine boost :: variant über int und float und einen statischen Besucher verwenden, der jeden einzelnen erhöht. Mit Klassenschnittstellen würde ich eine reine virtuelle Klassennummer und number_int und number_float Klassen verwenden, die daraus abgeleitet sind und eine "increment" Methode implementieren
Aus meinen Tests ist die Verwendung von Schnittstellen viel schneller als die Verwendung von Boost.Variant.
Ich habe den Code unten ausgeführt und diese Ergebnisse erhalten:
Virtuell: 00: 00: 00.001028
Variante: 00: 00: 00.012081
Warum glauben Sie, dass dieser Unterschied ist? Ich dachte Boost.Variant wäre viel schneller.
** Hinweis: Normalerweise verwendet Boost.Variant Heap-Zuordnungen, um sicherzustellen, dass die Variante immer nicht leer ist. Aber ich lese in der Boost.Variant Dokumentation, dass, wenn boost :: has_nothrow_copy true ist, es keine Heap-Zuweisungen verwendet, die Dinge wesentlich schneller machen sollten. Für int und float boost :: has_nothrow_copy ist true.
Hier ist mein Code zum Messen der beiden Ansätze gegeneinander.
Das ist offensichtlich, dass -O2 die Zeit der Variante reduziert, weil die ganze Schleife wegoptimiert ist. Ändern Sie die Implementierung, um das akkumulierte Ergebnis an den Aufrufer zurückzugeben, damit das Optimierungsprogramm die Schleife nicht entfernt, und Sie erhalten den tatsächlichen Unterschied:
Ausgabe:
Virtuell: 00: 00: 00.000120 = 10000000
Variante: 00: 00: 00.013483 = 10000000
Tags und Links performance boost interface virtual variant