我正在使用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毫秒。
答案 0 :(得分:1)
时间O(1)表示相对于大小的常数。因此,要求减速,您需要描述不同尺寸的测量结果。
虽然std::list
确实遵守了这一点,但内存运行时(new
,delete
)和操作系统(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预测相匹配的不同数据。
感谢反馈人员和女孩。