1. 程式人生 > 其它 >C++ vector遍歷方法,哪個最快

C++ vector遍歷方法,哪個最快

對比四種方式:下標、迭代器、auto迭代器、for range。

四種方式

  • 下標
  • 迭代器
  • auto迭代器
  • for range
#include <iostream> 
#include <vector> 
#include <stdint.h> 
#include <ctime> 
 
int main() 
{ 
    const uint32_t loop = 10000000; 
    std::vector<int32_t> vec; 
    clock_t timeStart = 0; 
    for (uint32_t i = 0; i < loop; ++i) 
    { 
        vec.push_back(i); 
    } 
    // test time use 
    // 1.by index 
    timeStart = clock(); 
    uint64_t sum1 = 0; 
    for (uint32_t i = 0; i < vec.size(); ++i) 
    { 
        sum1+=vec[i]; 
    } 
    std::cout << sum1<<" "<< clock() - timeStart << "ms" << std::endl; 
    // 2.by iterator 
    timeStart = clock(); 
    uint64_t sum2 = 0; 
    for (std::vector<int32_t>::const_iterator it = vec.begin(); it != vec.end(); ++it) 
    { 
        sum2 +=*it; 
    } 
    std::cout << sum2 << " " << clock() - timeStart << "ms" << std::endl; 
    // 3.by auto iterator 
    uint64_t sum3 = 0; 
    timeStart = clock(); 
    for (auto it = vec.begin(); it != vec.end(); ++it) 
    { 
        sum3 += *it; 
    } 
    std::cout << sum3 << " " << clock() - timeStart << "ms" << std::endl; 
 
    // 4.by for range 
    uint64_t sum4 = 0; 
    timeStart = clock(); 
    for (const auto & it :vec) 
    { 
        sum4 += it; 
    } 
    std::cout << sum4 << " " << clock() - timeStart << "ms" << std::endl; 
    
    return 0; 
} 

VS2019

debug

loop=1kw

49999995000000 354ms 
49999995000000 3867ms 
49999995000000 4089ms 
49999995000000 18ms    為什麼這種寫法最快?

forrange最快。index比iterator快10倍,auto iterator略慢於iterator。

release

loop=1kw

49999995000000 12ms 
49999995000000 13ms 
49999995000000 14ms 
49999995000000 4ms

forrange仍然最快,其他3個差不多,約為forrange的3倍


loop=10kw

4999999950000000 118ms 
4999999950000000 130ms 
4999999950000000 129ms 
4999999950000000 33ms

同上

gcc 4.8.5

debug

loop=1kw

 g++ -DDEBUG  -std=c++11  -g main.cpp       
./a.out                               
49999995000000 80ms   為什麼這種寫法最快?
49999995000000 240ms 
49999995000000 240ms 
49999995000000 180ms

index最快


loop=10kw

g++ -DDEBUG  -std=c++11  -g main.cpp
./a.out                          
4999999950000000 740ms 
4999999950000000 2350ms 
4999999950000000 2450ms 
4999999950000000 1800ms 

同上

release

loop=10kw

g++   -std=c++11 -O2  main.cpp  
4999999950000000 50ms 
4999999950000000 40ms 
4999999950000000 40ms 
4999999950000000 40ms 

4種寫法都差不多

結論

優化後,vs for range最快,gcc 4種寫法幾乎沒區別。
for range遍歷vector是最快的一種寫法。跨平臺時,優先選for range。
儘量用新版本特性,語法簡單,效能也好。