将元素随机插入向量时随机减速

时间:2013-12-14 11:46:47

标签: c++ performance vector slowdown

修改 我修好了插入。正如Blastfurnace所说,插入使迭代器失效。需要循环我相信比较性能(参见我对Blastfurnance答案的评论)。我的代码已更新。我有完全相似的列表代码,只是用list替换了vector。但是,使用代码我发现列表对于小型和大型数据类型甚至对于线性搜索(如果我删除插入)都比向量性能更好。根据{{​​3}}和其他不应该如此的网站。有什么线索可以解决这个问题吗?

我正在学习数学软件的编程课程(星期一的考试),为此,我想提供一个图表,比较随机插入元素到矢量和列表之间的性能。但是,当我测试代码时,我会得到随机减速。例如,我可能有2次迭代,其中随机地将10个元素插入到大小为500的向量中需要0.01秒,然后是3个类似的迭代,每个迭代大约需要12秒。这是我的代码:

    void AddRandomPlaceVector(vector<FillSize> &myContainer, int place)  {
    int i = 0;

    vector<FillSize>::iterator iter = myContainer.begin();

    while (iter != myContainer.end())
    {
        if (i == place)
        {
            FillSize myFill;
            iter = myContainer.insert(iter, myFill);
        }
        else
            ++iter;

        ++i;
    }

    //cout << i << endl;
}

double testVector(int containerSize, int iterRand)
{
    cout << endl;
    cout << "Size: " << containerSize << endl << "Random inserts: " << iterRand << endl;

    vector<FillSize> myContainer(containerSize);
    boost::timer::auto_cpu_timer tid;

    for (int i = 0; i != iterRand; i++)
    {
        double randNumber = (int)(myContainer.size()*((double)rand()/RAND_MAX));
        AddRandomPlaceVector(myContainer, randNumber);
    }

    double wallTime = tid.elapsed().wall/1e9;

    cout << "New size: " << myContainer.size();

    return wallTime;
}

int main()
{
    int testSize = 500;
    int measurementIters = 20;
    int numRand = 1000;
    int repetionIters = 100;


    ofstream tidOutput1_sum("VectorTid_8bit_sum.txt");
    ofstream tidOutput2_sum("ListTid_8bit_sum.txt");

    for (int i = 0; i != measurementIters; i++)
    {
        double time = 0;

        for (int j = 0; j != repetionIters; j++) {
            time += testVector((i+1)*testSize, numRand);
        }

        std::ostringstream strs;
        strs << double(time/repetionIters);
        tidOutput1_sum << ((i+1)*testSize) << "," << strs.str() << endl;
    }

    for (int i = 0; i != measurementIters; i++)
    {
        double time = 0;

        for (int j = 0; j != repetionIters; j++) {
            time += testList((i+1)*testSize, numRand);
        }

        std::ostringstream strs;
        strs << double(time/repetionIters);
        tidOutput2_sum << ((i+1)*testSize) << "," << strs.str() << endl;
    }
    return 0;
}

struct FillSize
{
    double fill1;
};

结构只是为了让我轻松添加更多值,因此我可以测试不同大小的元素。我知道这个代码在性能测试方面可能并不完美,但他们宁愿让我做一个简单的例子而不仅仅是引用我发现的东西。

我现在已经在两台计算机上测试了这段代码,两者都有相同的问题。怎么可能?你可以帮我解决这个问题吗?也许在每次迭代之间增加几秒钟的等待时间会有帮助吗?

亲切的问候, Bjarke

1 个答案:

答案 0 :(得分:1)

您的AddRandomPlaceVector功能存在严重缺陷。使用insert()invalidate iterators,因此for循环无效代码。

如果您知道所需的插入点,则没有理由迭代vector

void AddRandomPlaceVector(vector<FillSize> &myContainer, int place)
{
    FillSize myFill;
    myContainer.insert(myContainer.begin() + place, myFill);
}