STL list.push_front运行时间比O(1)建议的时间长

时间:2016-04-16 07:17:22

标签: c++

我正在使用visual studio 2015的Perftips测试运行时,我注意到当我使用STL“列表”并访问push_front()函数时,它运行的时间比它应该长1000倍并且也在O(n)中它应该是O(1)的时间。

例如: 我正在创建一个带有一百万个随机整数的双向链表,当我知道它应该在3毫秒左右时,需要大约2000毫秒才能将单个int值添加到该百万长列表的前面。我还注意到运行时间随着我列表的大小线性扩展,这不是big-O所预测的。

以下是我正在测试的代码行:

list.push_front(10); // 10是任意数字

对于单链表和O(1)向量函数,我也遇到了同样的问题。有谁知道发生了什么?谢谢你的时间。

旁注: 我不确定我的硬件是否与它有任何关系但是,我有一台2.4Ghz笔记本电脑i7和半空700 gb硬盘和8Gb内存

编辑: 我还在测试时同时运行Microsoft Excel,Adobe Reader和chrome。我关闭了程序,它实际上将我的运行时间提高了大约100毫秒。

3 个答案:

答案 0 :(得分:1)

时间O(1)表示相对于大小的常数。因此,要求减速,您需要描述不同尺寸的测量结果。

虽然std::list确实遵守了这一点,但内存运行时(newdelete)和操作系统(HeapAlloc)都没有。

尝试运行发布版本(stl + new faster)

答案 1 :(得分:1)

看起来很漂亮O(1)给我:

#include <list>
#include <chrono>
#include <string>
#include <cmath>
#include <iostream>
#include <iomanip>


void run_test(size_t items)
{
    std::list<int> mylist;
    std::cout << "testing " << std::setw(9) << std::right << items << " insertions: ";
    std::cout.flush();

    auto t0 = std::chrono::high_resolution_clock::now();
    while(items) {
        mylist.push_front(10);
        --items;
    }
    auto t1 = std::chrono::high_resolution_clock::now();
    auto diff = t1 - t0;
    auto us = std::chrono::duration_cast<std::chrono::microseconds>(diff);
    std::cout << "took " << std::setw(9) << us.count() << "us to get to size " << std::setw(9) << mylist.size() << std::endl;
}

int main()
{

    for(int power = 1 ; power < 9 ; ++power)
    {
        run_test(std::pow(10, power));
    }
    return 0;
}

示例结果(clang,-O2,macbook pro on battery)

testing        10 insertions: took         1us to get to size        10
testing       100 insertions: took         5us to get to size       100
testing      1000 insertions: took        60us to get to size      1000
testing     10000 insertions: took       582us to get to size     10000
testing    100000 insertions: took      5832us to get to size    100000
testing   1000000 insertions: took     66873us to get to size   1000000
testing  10000000 insertions: took    622131us to get to size  10000000
testing 100000000 insertions: took   6636721us to get to size 100000000

答案 2 :(得分:0)

由@CraigEstey解决。

使用PerfTips时,我的系统出现了问题。我使用chrono stl运行代码,得到了与大O预测相匹配的不同数据。

感谢反馈人员和女孩。