Ich verwende std::deque
. Ich war sicher, dass das Ersetzen einer Schleife mit einer push_back
durch eine einzelne insert
eine Leistungssteigerung ergeben würde. Es wird auch empfohlen, zum Beispiel here.Push_back schneller als einfügen?
Aber jetzt bin ich mir nicht mehr so sicher.
Ich habe einige Benchmarks auf Testcode ausgeführt.
Main.cpp:
#include"queueInsert.h"
#include<Windows.h>
std::deque<int> queue;
constexpr size_t len = 64;
int arr[len];
int main()
{
DWORD startTime = GetTickCount();
for (int i = 0; i < 100000; ++i)
{
insert(queue, arr, len);
}
DWORD endTime = GetTickCount();
return endTime - startTime;
}
queueInsert.h:
#include<deque>
void insert(std::deque<int>&, int* arr, int n);
queueInsert.cpp -push Version
#include "queueInsert.h"
void insert(std::deque<int>& queue, int* arr, int n)
{
for (int i = 0; i < n; ++i)
{
queue.push_back(arr[i]);
}
}
queueInsert.cpp -insert Version
#include "queueInsert.h"
void insert(std::deque<int>& queue, int* arr, int n)
{
queue.insert(queue.end(), arr, arr + n);
}
Ich bekomme 203
Millisekunden mit push_back
, aber 218
mit insert
.
Ändern len
-6
, und die Erhöhung der Iterationen auf eine Million, hält das gleiche Ergebnis: 219
Mühlen für push
und 266
für insert
.
Nur mit len = 640
tut push
zu verlieren, und selbst dann nur sehr wenig: 1531
für push
gegen 1437
für insert
.
Ich bin in Release in Visual Studio 2015 unter Windows kompilieren 10.
Ich bin sicher, dass der Compiler nicht Optimierungen tut, um die konstante Anzahl von Iterationen als inlining oder die Schlaufen Absicherungen, wie jedes Mal, wenn ich das ändern Implementierung wird nur queueInsert.cpp
neu kompiliert.
Mache ich Profiling falsch? Oder sollte ich eigentlich push_back
behalten, wenn die Menge der einzufügenden Elemente wahrscheinlich nicht groß ist?
* Ich bin sicher, der Compiler macht keine Optimierungen * - Lassen Sie uns die Assembly Auflistung sehen. – PaulMcKenzie
Ich las Originalartikel, vergiss – Slava
Ich meinte Vektor als Folge von Elementen, nicht 'std :: vector'. Ich habe korrigiert, um die Bedeutung klarer zu machen. –