Я всегда считал своей общей мудростью, что std::vector "реализован как массив", бла-бла-бла. Сегодня я спустился и протестировал его, и, похоже, это не так:
Вот некоторые результаты теста:
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
Что примерно в 3 - 4 раза медленнее! На самом деле не оправдывает, что комментарии "vector могут быть медленнее для нескольких наносекументов".
И код, который я использовал:
#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;
}
Я делаю это неправильно или что-то в этом роде? Или я просто разрушил этот миф о производительности?
Я использую режим Release в Visual Studio 2005.
В Visual С++, #define _SECURE_SCL 0 уменьшает UseVector наполовину (доведя его до 4 секунд). Это действительно огромно, ИМО.
