Sind STL-Algorithmen auf Geschwindigkeit optimiert?

8

Ich habe die Geschwindigkeit verschiedener Wege auf einem std :: vector getestet. Im folgenden Code betrachte ich 5 Möglichkeiten, um die Summe aller Elemente eines Vektors von N = 10000000 Elementen zu berechnen:

  1. mit Iteratoren
  2. mit ganzzahligen Indizes
  3. mit ganzzahligen Indizes, Abrollen um einen Faktor 2
  4. mit ganzzahligen Indizes, Abrollen um einen Faktor 4
  5. mit std :: accumulate

Der Code wird mit g ++ für Windows kompiliert, die zum Kompilieren verwendete Befehlszeile lautet:

%Vor%

Ich habe den Code viermal ausgeführt, wobei ich die Zeit jeder Methode gemessen habe. Ich erhalte die folgenden Ergebnisse (Zeit in Mikrosekunden, Max und Min sind angegeben):

  • Iteratoren: 8002 - 8007
  • Int-Indizes: 8004 - 9003
  • Ausrollen 2: 6004 - 7005
  • Ausrollen 4: 4001 - 5004
  • ansammeln: 8005 - 9007

Was diese Experimente zu zeigen scheinen, ist:

  1. Das Schleifen mit Iteratoren gegen ganzzahlige Indizes macht zumindest bei vollständiger Optimierung keinen großen Unterschied.

  2. Das Abwickeln der Schleife zahlt sich aus

  3. aus
  4. Überraschenderweise ergibt das stl :: accumum die schlechtere Leistung.

Während die Schlussfolgerungen 1 und 2 etwas erwartet wurden, ist die Zahl 3 ziemlich überraschend. Sagen nicht alle Bücher, die STL-Algorithmen zu verwenden, anstatt selbst Schleifen zu schreiben?

Mache ich einen Fehler in der Art und Weise, wie ich die Zeit gemessen habe, oder in der Art und Weise, wie ich die Ergebnisse interpretiere? Habt ihr ein anderes Szenario, falls ihr den unten angegebenen Code ausprobiert?

%Vor%     
Giuseppe 17.03.2015, 23:00
quelle

2 Antworten

2

Der Grund für die Verwendung der Standardbibliotheksalgorithmen ist nicht , um eine bessere Effizienz zu erreichen, sondern um Ihnen zu ermöglichen, auf einer höheren Abstraktionsebene zu denken.

In einigen Fällen ist der Algorithmus zwar schneller als Ihr eigener handgenerierter Code, dafür sind sie aber nicht da. Einer der großen Vorteile von C ++ ist, dass Sie die integrierten Bibliotheken umgehen können, wenn Sie einen bestimmten Bedarf haben. Wenn Ihr Benchmarking gezeigt hat, dass die Standardbibliothek eine kritische Verlangsamung verursacht, können Sie klassische Alternativen wie Loop Unrolling erkunden. Für die meisten Zwecke wird das nie nötig sein.

Damit wird ein gut geschriebener Standard-Bibliotheksalgorithmus nie schrecklich langsamer sein als Ihre eigene einfache Implementierung, es sei denn, Sie nutzen die Kenntnis der Besonderheiten Ihrer Daten.

    
Mark Ransom 18.03.2015 04:16
quelle
0

Zusätzlich zu Mar würde ich das denken STL ist in den meisten Fällen nicht schneller als Ihre eigene Implementierung, da es sich um eine allgemeine Lösung für eine Reihe verwandter Fragen handelt, aber nicht für eine bestimmte. Daher ist es wahrscheinlich, dass STL mehr Faktoren berücksichtigt, als Sie wirklich benötigen, also weniger effizient. Aber es gibt eine Ausnahme: stl :: sort verwendet eine subtile Optimierung (vielleicht einen Mix aus verschiedenen Sortieralgorithmen), so dass es schneller als übliche Implementierungen funktioniert.

    
minglotus 27.03.2015 16:02
quelle

Tags und Links