Saya selalu berpikir itu adalah kebijaksanaan umum yang std::vector
"diimplementasikan sebagai sebuah array," bla bla bla. Hari ini saya turun dan mengujinya, dan tampaknya tidak begitu:
Inilah beberapa hasil tes:
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
Itu sekitar 3 - 4 kali lebih lambat! Tidak benar-benar membenarkan untuk vector
komentar " mungkin lebih lambat untuk beberapa nanosec".
Dan kode yang saya gunakan:
#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;
}
Apakah saya melakukan kesalahan atau sesuatu? Atau apakah saya baru saja merusak mitos kinerja ini?
Saya menggunakan mode Rilis di Visual Studio 2005 .
Dalam Visual C ++ , #define _SECURE_SCL 0
kurangi UseVector
setengahnya (turun menjadi 4 detik). Ini sangat besar, IMO.
vector
adalah array yang dapat diubah ukurannya untuk tujuan umum. Selamat. Seperti halnya semua alat tujuan umum, dimungkinkan untuk membuat situasi khusus yang tidak optimal. Itulah sebabnya kebijaksanaan konvensional adalah memulai dengan vector
dan mempertimbangkan alternatif jika perlu.