17 Stimmen

Standard-Vektor und Boost-Array: Was ist schneller?

Wie die Leistung von boost::array im Vergleich zu dem von std::vector und welche Faktoren haben einen wesentlichen Einfluss darauf?

33voto

wilhelmtell Punkte 55189

boost::array (oder C++0x's std::array ) sollte schneller sein als std::vector denn boost::array Instanzen befinden sich vollständig auf dem Stapel. Das bedeutet boost::array hat keine Heap-Allokation, und das bedeutet auch, dass es nicht über die Größe hinauswachsen kann, die Sie beim Bau angeben.

Der Zweck der boost::array soll als dünne Schicht um primitive Arrays herum dienen, so dass man sie wie Standardcontainer behandeln kann mit .begin() , .end() usw. Gute Compiler sollten den gesamten Overhead von boost::array so dass es sich genauso verhält wie primitive Arrays.


All dies bezieht sich auf "Standard"-Einstellungen, bei denen Sie keine benutzerdefinierten Zuweisungen haben und einfache Dinge wie Array-Konstruktion, Zugriff und Änderung von Elementen messen. Andererseits können sich die Dinge in anderen Tests, auf anderen Plattformen oder mit einem cleveren Setup umkehren. Zum Beispiel,

  • wenn Sie einen benutzerdefinierten Allokator erstellen, der vielleicht beim Programmstart einen großen Speicherpool erwirbt und dann eine Datei erstellt oder deren Größe ändert std::vector vielleicht nicht mehr ganz so teuer sein.
  • Austauschen einer std::vector mit einem anderen ist normalerweise eine sehr schnelle Operation; die Geschwindigkeit des Vertauschens von zwei Zeigern. Das Vertauschen von zwei boost::array Instanzen könnten viel teurer sein; in der Größenordnung des Kopierens n Elemente. Aber dann, in C++0x, von dem std::array ein Teil sein wird, wird der Austausch von zwei Arrays dank rvalue-Referenzen und ihrer Move-Semantik wieder schnell sein.
  • Das Kopieren eines Vektors kann eine sehr schnelle Operation sein, so schnell wie das Kopieren eines Zeigers (copy on write). Das Kopieren eines boost::array kann es erforderlich sein, jedes Array-Element zu kopieren. Andererseits ist das Kopieren eines beliebigen Objekts manchmal sehr schnell, sogar schneller als das Kopieren eines Zeigers und sogar in Ihrem C++03-Compiler - dank der Kopierelision.

Sie können ein Profil erstellen, um herauszufinden, welcher Compiler für Ihre Zwecke schneller ist, aber selbst dieser Test gibt Ihnen nur einen Eindruck für eine bestimmte Version eines bestimmten Compilers auf einer bestimmten Plattform.

17voto

Nawaz Punkte 339767

Der beste Weg, um zu einer Schlussfolgerung zu gelangen, ist das Schreiben von Programmen, um deren Leistung mit großen Datenmengen zu testen. Wie kann man sonst zu einer Schlussfolgerung kommen?

Wenn Sie schon dabei sind, brauchen Sie vielleicht einige Hilfsmittel, wie zum Beispiel VTune , oder AMD CodeAnalyst Leistungsanalysator , usw. Sehr schläfrig (kostenloses Tool) ist ein C/C++ CPU-Profiler für Windows-Systeme. Sie können sie ausprobieren!

12voto

GManNickG Punkte 476445

Schneller bei was? std::vector ist schneller zu tippen, weil sie ein Zeichen weniger hat.

Es spielt keine Rolle, was schneller ist, Sie vergleichen zwei verschiedene Dinge, ein statisch dimensioniertes Array mit einem dynamisch dimensionierten Array. Welches Sie verwenden, hängt von Ihrer Anwendung ab und hat nichts mit der Geschwindigkeit zu tun.

Möchten Sie ein Flugzeug oder ein Auto zu einem bestimmten Ort steuern? Das hängt von mehr ab als davon, was einfach "schneller" ist.


A boost::array kann schneller zugewiesen werden, weil es auf typischen Maschinen auf dem Stack liegt. Oder std::vector kann aufgrund eines benutzerdefinierten Speicherzuweisungsschemas fast genauso schnell sein.

Aber das ist nur eine Aufteilung. Was ist mit der Verwendung? Nun, beides sind nur Indizes in einem Array, also gibt es da vielleicht keinen Unterschied. Aber was ist mit Verschieben oder Vertauschen? boost::array Das geht sicher nicht so schnell, denn std::vector muss nur einen Zeiger bewegen/wechseln. Oder vielleicht auch nicht, wer weiß?

Sie müssen ein Profil erstellen und sich die Baugruppe ansehen. Niemand kann auf magische Weise wissen, wie die Dinge für Sie funktionieren.

2voto

Zac Howland Punkte 15505

array y vector dienen leicht unterschiedlichen Zwecken. Wenn Sie eine vector auf die von Ihnen benötigte Größe reduziert und nie neu zugewiesen wird, ist die Leistung der beiden identisch. array behandelt nur statisch dimensionierte Arrays (Arrays im C-Stil, wenn Sie so wollen). vector kann wachsen, wenn Sie mehr Objekte in den Container schieben, als er derzeit fassen kann.

0 Stimmen

Da Vektoren auf die zugrundeliegenden Daten über einen Zeiger zugreifen müssen, kann es einen leichten Leistungsvorteil gegenüber Arrays geben, da der Vektorzugriff über eine weitere Umleitungsebene erfolgen muss. Ich bezweifle, dass dies ein Faktor ist, der auf moderner Hardware in Betracht gezogen werden sollte, außer in extremen Fällen.

0 Stimmen

Er sprach nicht von einem Array im C-Stil, sondern von der std::array (alias boost::array ), die den gleichen "Hit" bei der Umleitungsleistung hat wie ein Vektor (beide sind so winzig, dass es ohnehin keine Rolle spielt).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X