Der Grund push_back
ist langsam, dass es alle Daten mehrmals kopieren muss, wie der Vektor wächst, und selbst wenn es keine Daten kopieren muss, muss es überprüfen. Vektoren wachsen schnell genug, dass dies nicht oft passiert, aber es passiert immer noch. Eine grobe Faustregel besagt, dass jedes Element im Durchschnitt ein- oder zweimal kopiert werden muss. Die früheren Elemente müssen viel mehr kopiert werden, aber fast die Hälfte der Elemente muss überhaupt nicht kopiert werden.
Sie können das Kopieren, nicht aber die Prüfungen vermeiden, indem Sie beim Erstellen des Vektors den Vektor reserve
aufrufen und sicherstellen, dass genügend Speicherplatz vorhanden ist. Sie können sowohl das Kopieren als auch die Prüfungen vermeiden, indem Sie sie von Anfang an mit der richtigen Größe erstellen, indem Sie dem Vektorkonstruktor die Anzahl der Elemente geben und dann mit der Indizierung als Tobias suggested; Leider geht das auch durch den Vektor eine extra Zeit, die alles initialisiert.
Wenn Sie die Anzahl der Gleitkommazahlen zur Kompilierzeit und nicht nur zur Laufzeit kennen, können Sie eine std::array
verwenden, die all diese Probleme vermeidet. Wenn du nur die Nummer zur Laufzeit kennst, würde ich Mark’s suggestion mit std::unique_ptr<float[]>
nachholen. Sie würden es mit
size_t size = /* Number of floats */;
auto floats = unique_ptr<float[]>{new float[size]};
erstellen Sie müssen nichts Besonderes tun, um dies zu löschen; Wenn es den Rahmen verlässt, wird es den Speicher freigeben. In den meisten Fällen können Sie es wie einen Vektor verwenden, aber es wird nicht automatisch die Größe ändern.
[std :: vector :: reserve] (http://en.cppreference.com/w/cpp/container/vector/reserve) –
@ FrançoisAndrieux dies dauert noch 6 Sekunden :(ist dies eines dieser Dinge Ich muss es einfach akzeptieren? – anc
Das sind ungefähr 35 Nano-Sekunden pro 'Pushback' (für 172,490,752). Du * kopierst * über 100 Millionen Floats. –