zoukankan      html  css  js  c++  java
  • Vector遍历性能对比

    偶然发现,遍历vector时,使用两种看上去没什么差别的方法,性能上却有很大的差异。

    #include <iostream>
    #include <vector>
    
    class CPoint{
    public:
        int x;
        int y;
    };
    
    int VectorRead_0(const CPoint* arr, size_t size)
    {
        int result = 0;
        for(size_t i = 0; i < size; i ++){
            result += (arr[i].x + arr[i].y);
        }
        return result;
    }
    int VectorRead_1(const vector<CPoint> &arr)
    {
        int result = 0;
        for(size_t i = 0; i < arr.size(); i ++){
            result += (arr[i].x + arr[i].y);
        }
        return result;
    }
    int VectorRead_2(const vector<CPoint> &arr)
    {
        size_t size = arr.size();
        int result = 0;
        for(size_t i = 0; i < size; i ++){
            result += (arr[i].x + arr[i].y);
        }
        return result;
    }
    int VectorRead_3(const vector<CPoint> &arr)
    {
        size_t size = arr.size();
        const CPoint* pArr = &arr[0];
        int result = 0;
        for(size_t i = 0; i < size; i ++){
            result += (pArr[i].x + pArr[i].y);
        }
        return result;
    }
    
    void TestVectorRead()
    {
        const int arrSize = 100000;
        vector<CPoint> arr(arrSize);
        int        i, nLoopCount = 100000;
        DWORD    start,end;
        int    result;
    
        for(i = 0; i < arrSize; i ++){
            arr[i].x = i % 3;
            arr[i].y = i % 4;
        }
    
        start = ::GetTickCount();
        result = 0;
        for (i = 0; i < nLoopCount; i++){
            result += VectorRead_0(&arr[0], arrSize);
        }
        end = ::GetTickCount();
        cout << "VectorRead_0 takes: " << end - start << " result: " << result << std::endl;
    
        start = ::GetTickCount();
        result = 0;
        for (i = 0; i < nLoopCount; i++){
            result += VectorRead_1(arr);
        }
        end = ::GetTickCount();
        cout << "VectorRead_1 takes: " << end - start << " result: " << result << std::endl;
    
        start = ::GetTickCount();
        result = 0;
        for (i = 0; i < nLoopCount; i++){
            result += VectorRead_2(arr);
        }
        end = ::GetTickCount();
        cout << "VectorRead_2 takes: " << end - start << " result: " << result << std::endl;
    
        start = ::GetTickCount();
        result = 0;
        for (i = 0; i < nLoopCount; i++){
            result += VectorRead_3(arr);
        }
        end = ::GetTickCount();
        cout << "VectorRead_3 takes: " << end - start << " result: " << result << std::endl;
    }

    执行结果(运行环境:ThinkPad T430,VS2013):

    VectorRead_0 takes: 5663 result: -769903776
    VectorRead_1 takes: 0 result: -769903776
    VectorRead_2 takes: 0 result: -769903776
    VectorRead_3 takes: 0 result: -769903776

    可见,VectorRead_0性能非常糟糕,很可能编译器对vector有特殊的优化。

    另外,用同样的方式测试了vector在写入情况下的性能,几种方法在性能上并没有明显差异。

  • 相关阅读:
    图论复习
    数据结构复习
    数学复习
    字符串算法复习
    还有9天就要走了
    JS 多个一维数组排例组合的所有可能
    PHP 多个一维数组排列组合的所有可能
    维护DOWNID
    LINUX
    Multiple Versions of PHP run on server
  • 原文地址:https://www.cnblogs.com/zhuyingchun/p/8933907.html
Copyright © 2011-2022 走看看