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

后端 未结 22 2773
南方客
南方客 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:17

    It seems to depend on the compiler flags. Here is a benchmark code:

    #include 
    #include 
    #include 
    #include 
    #include 
    
    
    int main(){
    
        int size = 1000000; // reduce this number in case your program crashes
        int L = 10;
    
        std::cout << "size=" << size << " L=" << L << std::endl;
        {
            srand( time(0) );
            double * data = new double[size];
            double result = 0.;
            std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
            for( int l = 0; l < L; l++ ) {
                for( int i = 0; i < size; i++ ) data[i] = rand() % 100;
                for( int i = 0; i < size; i++ ) result += data[i] * data[i];
            }
            std::chrono::steady_clock::time_point end   = std::chrono::steady_clock::now();
            auto duration = std::chrono::duration_cast(end - start).count();
            std::cout << "Calculation result is " << sqrt(result) << "\n";
            std::cout << "Duration of C style heap array:    " << duration << "ms\n";
            delete data;
        }
    
        {
            srand( 1 + time(0) );
            double data[size]; // technically, non-compliant with C++ standard.
            double result = 0.;
            std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
            for( int l = 0; l < L; l++ ) {
                for( int i = 0; i < size; i++ ) data[i] = rand() % 100;
                for( int i = 0; i < size; i++ ) result += data[i] * data[i];
            }
            std::chrono::steady_clock::time_point end   = std::chrono::steady_clock::now();
            auto duration = std::chrono::duration_cast(end - start).count();
            std::cout << "Calculation result is " << sqrt(result) << "\n";
            std::cout << "Duration of C99 style stack array: " << duration << "ms\n";
        }
    
        {
            srand( 2 + time(0) );
            std::vector data( size );
            double result = 0.;
            std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
            for( int l = 0; l < L; l++ ) {
                for( int i = 0; i < size; i++ ) data[i] = rand() % 100;
                for( int i = 0; i < size; i++ ) result += data[i] * data[i];
            }
            std::chrono::steady_clock::time_point end   = std::chrono::steady_clock::now();
            auto duration = std::chrono::duration_cast(end - start).count();
            std::cout << "Calculation result is " << sqrt(result) << "\n";
            std::cout << "Duration of std::vector array:     " << duration << "ms\n";
        }
    
        return 0;
    }
    

    Different optimization flags give different answers:

    $ g++ -O0 benchmark.cpp 
    $ ./a.out 
    size=1000000 L=10
    Calculation result is 181182
    Duration of C style heap array:    118441ms
    Calculation result is 181240
    Duration of C99 style stack array: 104920ms
    Calculation result is 181210
    Duration of std::vector array:     124477ms
    $g++ -O3 benchmark.cpp
    $ ./a.out 
    size=1000000 L=10
    Calculation result is 181213
    Duration of C style heap array:    107803ms
    Calculation result is 181198
    Duration of C99 style stack array: 87247ms
    Calculation result is 181204
    Duration of std::vector array:     89083ms
    $ g++ -Ofast benchmark.cpp 
    $ ./a.out 
    size=1000000 L=10
    Calculation result is 181164
    Duration of C style heap array:    93530ms
    Calculation result is 181179
    Duration of C99 style stack array: 80620ms
    Calculation result is 181191
    Duration of std::vector array:     78830ms
    

    Your exact results will vary but this is quite typical on my machine.

提交回复
热议问题