C++ Array vs vector

前端 未结 8 997
伪装坚强ぢ
伪装坚强ぢ 2021-01-03 06:06

when using C++ vector, time spent is 718 milliseconds, while when I use Array, time is almost 0 milliseconds.

Why so much performance difference?

int         


        
8条回答
  •  伪装坚强ぢ
    2021-01-03 06:41

    To get a fair comparison I think something like the following should be suitable:

    #include 
    #include 
    #include 
    #include 
    #include 
    
    
    int main()
    {
      static size_t const size = 7e6;
    
      timeval start, end;
      int sum;
    
      gettimeofday(&start, 0);
      {
        std::vector v(size, 1);
        sum = std::accumulate(v.begin(), v.end(), 0);
      }
      gettimeofday(&end, 0);
    
      std::cout << "= vector =" << std::endl
            << "(" << end.tv_sec - start.tv_sec
            << " s, " << end.tv_usec - start.tv_usec
            << " us)" << std::endl
            << "sum = " << sum << std::endl << std::endl;
    
      gettimeofday(&start, 0);
      int * const arr =  new int[size];
      std::fill(arr, arr + size, 1);
      sum = std::accumulate(arr, arr + size, 0);
      delete [] arr;
      gettimeofday(&end, 0);
    
      std::cout << "= Simple array =" << std::endl
            << "(" << end.tv_sec - start.tv_sec
            << " s, " << end.tv_usec - start.tv_usec
            << " us)" << std::endl
            << "sum = " << sum << std::endl << std::endl;
    }
    

    In both cases, dynamic allocation and deallocation is performed, as well as accesses to elements.

    On my Linux box:

    $ g++ -O2 foo.cpp 
    $ ./a.out 
    = vector =
    (0 s, 21085 us)
    sum = 7000000
    
    = Simple array =
    (0 s, 21148 us)
    sum = 7000000
    

    Both the std::vector<> and array cases have comparable performance. The point is that std::vector<> can be just as fast as a simple array if your code is structured appropriately.


    On a related note switching off optimization makes a huge difference in this case:

    $ g++ foo.cpp 
    $ ./a.out 
    = vector =
    (0 s, 120357 us)
    sum = 7000000
    
    = Simple array =
    (0 s, 60569 us)
    sum = 7000000
    

    Many of the optimization assertions made by folks like Neil and jalf are entirely correct.

    HTH!

    EDIT: Corrected code to force vector destruction to be included in time measurement.

提交回复
热议问题