Is std::vector so much slower than plain arrays?

后端 未结 22 2739
南方客
南方客 2020-11-22 12:00

I\'ve always thought it\'s the general wisdom that std::vector is \"implemented as an array,\" blah blah blah. Today I went down and tested it, and it seems to

22条回答
  •  再見小時候
    2020-11-22 12:23

    I Have to say I'm not an expert in C++. But to add some experiments results:

    compile: gcc-6.2.0/bin/g++ -O3 -std=c++14 vector.cpp

    machine:

    Intel(R) Xeon(R) CPU E5-2690 v2 @ 3.00GHz 
    

    OS:

    2.6.32-642.13.1.el6.x86_64
    

    Output:

    UseArray completed in 0.167821 seconds
    UseVector completed in 0.134402 seconds
    UseConstructor completed in 0.134806 seconds
    UseFillConstructor completed in 1.00279 seconds
    UseVectorPushBack completed in 6.6887 seconds
    The whole thing completed in 8.12888 seconds
    

    Here the only thing I feel strange is that "UseFillConstructor" performance compared with "UseConstructor".

    The code:

    void UseConstructor()
    {
        TestTimer t("UseConstructor");
    
        for(int i = 0; i < 1000; ++i)
        {
            int dimension = 999;
    
            std::vector pixels(dimension*dimension);
            for(int i = 0; i < dimension * dimension; ++i)
            {
                pixels[i].r = 255;
                pixels[i].g = 0;
                pixels[i].b = 0;
            }
        }
    }
    
    
    void UseFillConstructor()
    {
        TestTimer t("UseFillConstructor");
    
        for(int i = 0; i < 1000; ++i)
        {
            int dimension = 999;
    
            std::vector pixels(dimension*dimension, Pixel(255,0,0));
        }
    }
    

    So the additional "value" provided slows down performance quite a lot, which I think is due to multiple call to copy constructor. But...

    Compile:

    gcc-6.2.0/bin/g++ -std=c++14 -O vector.cpp
    

    Output:

    UseArray completed in 1.02464 seconds
    UseVector completed in 1.31056 seconds
    UseConstructor completed in 1.47413 seconds
    UseFillConstructor completed in 1.01555 seconds
    UseVectorPushBack completed in 6.9597 seconds
    The whole thing completed in 11.7851 seconds
    

    So in this case, gcc optimization is very important but it can't help you much when a value is provided as default. This, is against my tuition actually. Hopefully it helps new programmer when choose which vector initialization format.

提交回复
热议问题