Tôi đã luôn nghĩ rằng đó là sự khôn ngoan chung std::vector
được "thực hiện như một mảng", blah blah blah. Hôm nay tôi đã đi xuống và thử nghiệm nó, và có vẻ như không phải vậy:
Đây là một số kết quả thử nghiệm:
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
Đó là chậm hơn khoảng 3 - 4 lần! Không thực sự biện minh cho các bình luận " vector
có thể chậm hơn đối với một vài nano".
Và mã tôi đã sử dụng:
#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;
}
Tôi đang làm sai hay gì đó? Hay tôi vừa làm hỏng huyền thoại hiệu suất này?
Tôi đang sử dụng chế độ Phát hành trong Visual Studio 2005 .
Trong Visual C ++ , #define _SECURE_SCL 0
giảm UseVector
một nửa (giảm xuống còn 4 giây). Điều này thực sự rất lớn, IMO.
vector
là một mảng có thể thay đổi kích thước mục đích chung. Xin chúc mừng. Như với tất cả các công cụ mục đích chung, có thể đưa ra các tình huống chuyên biệt trong đó nó là tối ưu phụ. Đó là lý do tại sao sự khôn ngoan thông thường là bắt đầu với a vector
và xem xét các lựa chọn thay thế nếu cần thiết.