C++ STL: Which method of iteration over a STL container is better?

后端 未结 9 1031
轻奢々
轻奢々 2020-12-09 11:43

This may seem frivolous to some of you, but which of the following 2 methods of iteration over a STL container is better? Why?



        
9条回答
  •  悲哀的现实
    2020-12-09 12:18

    Coincidentally I made a speed test recently (filling 10 * 1024 * 1024 ints with rand() ).
    These are 3 runs, time in nano-seconds

    vect[i] time      : 373611869  
    vec.at(i) time    : 473297793  
    *it = time        : 446818590  
    arr[i] time       : 390357294  
    *ptr time         : 356895778  
    

    UPDATE : added stl-algorithm std::generate, which seems to run the fastest, because of special iterator-optimizing (VC++2008). time in micro-seconds.

    vect[i] time      : 393951
    vec.at(i) time    : 551387
    *it = time        : 596080
    generate = time   : 346591
    arr[i] time       : 375432
    *ptr time         : 334612
    

    Conclusion : Use standard-algorithms, they might be faster than a explicit loop ! (and also good practice)

    Update : the above times were in a I/O-bound situation, I did the same tests with a CPU-bound (iterate over a relatively short vector, which should fit in cache repeatedly, multiply each element by 2 and write back to vector)

    //Visual Studio 2008 Express Edition
    vect[i] time      : 1356811
    vec.at(i) time    : 7760148
    *it = time        : 4913112
    for_each = time   : 455713
    arr[i] time       : 446280
    *ptr time         : 429595
    
    //GCC
    vect[i] time      : 431039
    vec.at(i) time    : 2421283
    *it = time        : 381400
    for_each = time   : 380972
    arr[i] time       : 363563
    *ptr time         : 365971  
    

    Interestingly iterators and operator[] is considerably slower in VC++ compared to for_each (which seems to degrade the iterators to pointers through some template-magic for performance).
    In GCC access times are only worse for at(), which is normal, because it's the only range-checked function of the tests.

提交回复
热议问题