Boost.Variant Vs Leistung der virtuellen Schnittstelle

8

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.

%Vor%     
Tal Zion 10.08.2012, 17:46
quelle

2 Antworten

14

Für Interessierte, nachdem ich etwas frustriert war, habe ich die Option -O2 an den Compiler übergeben und Boost :: variant war viel schneller als ein virtueller Anruf.
Danke

    
Tal Zion 19.08.2012, 17:59
quelle
4

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

%Vor%     
Serge Aleynikov 29.03.2015 15:23
quelle