Ich habe immer gedacht, dass es die allgemeine Weisheit std::vector
ist, die "als Array implementiert" ist, bla bla bla. Heute bin ich runtergegangen und habe es getestet, und es scheint nicht so zu sein:
Hier sind einige Testergebnisse:
UseArray completed in 2.619 seconds
UseVector completed in 9.284 seconds
UseVectorPushBack completed in 14.669 seconds
The whole thing completed in 26.591 seconds
Das ist ungefähr 3 - 4 mal langsamer! Rechtfertigt nicht wirklich die vector
Kommentare " Kann für ein paar Nanosekunden langsamer sein".
Und der Code, den ich verwendet habe:
#include <cstdlib>
#include <vector>
#include <iostream>
#include <string>
#include <boost/date_time/posix_time/ptime.hpp>
#include <boost/date_time/microsec_time_clock.hpp>
class TestTimer
{
public:
TestTimer(const std::string & name) : name(name),
start(boost::date_time::microsec_clock<boost::posix_time::ptime>::local_time())
{
}
~TestTimer()
{
using namespace std;
using namespace boost;
posix_time::ptime now(date_time::microsec_clock<posix_time::ptime>::local_time());
posix_time::time_duration d = now - start;
cout << name << " completed in " << d.total_milliseconds() / 1000.0 <<
" seconds" << endl;
}
private:
std::string name;
boost::posix_time::ptime start;
};
struct Pixel
{
Pixel()
{
}
Pixel(unsigned char r, unsigned char g, unsigned char b) : r(r), g(g), b(b)
{
}
unsigned char r, g, b;
};
void UseVector()
{
TestTimer t("UseVector");
for(int i = 0; i < 1000; ++i)
{
int dimension = 999;
std::vector<Pixel> pixels;
pixels.resize(dimension * dimension);
for(int i = 0; i < dimension * dimension; ++i)
{
pixels[i].r = 255;
pixels[i].g = 0;
pixels[i].b = 0;
}
}
}
void UseVectorPushBack()
{
TestTimer t("UseVectorPushBack");
for(int i = 0; i < 1000; ++i)
{
int dimension = 999;
std::vector<Pixel> pixels;
pixels.reserve(dimension * dimension);
for(int i = 0; i < dimension * dimension; ++i)
pixels.push_back(Pixel(255, 0, 0));
}
}
void UseArray()
{
TestTimer t("UseArray");
for(int i = 0; i < 1000; ++i)
{
int dimension = 999;
Pixel * pixels = (Pixel *)malloc(sizeof(Pixel) * dimension * dimension);
for(int i = 0 ; i < dimension * dimension; ++i)
{
pixels[i].r = 255;
pixels[i].g = 0;
pixels[i].b = 0;
}
free(pixels);
}
}
int main()
{
TestTimer t1("The whole thing");
UseArray();
UseVector();
UseVectorPushBack();
return 0;
}
Mache ich es falsch oder so? Oder habe ich gerade diesen Performance-Mythos gesprengt?
Ich verwende den Release-Modus in Visual Studio 2005 .
In Visual C ++ , #define _SECURE_SCL 0
verringert UseVector
um die Hälfte (bringt es auf 4 Sekunden nach unten). Das ist wirklich riesig, IMO.
vector
es sich um ein Allzweck-Array mit veränderbarer Größe handelt. Herzliche Glückwünsche. Wie bei allen Allzweckwerkzeugen ist es möglich, spezielle Situationen zu entwickeln, in denen sie nicht optimal sind. Aus diesem Grund besteht die konventionelle Weisheit darin, mit a zu beginnenvector
und gegebenenfalls Alternativen in Betracht zu ziehen.