c – std :: vector比plain数组快吗?

我刚刚尝试在std :: vector< std :: pair< float,unsigned int>>上对std :: sort进行基准测试. (填充了push_back操作)和plain std :: pair< float,unsigned int>> *数组(使用new分配然后逐个填充).比较函数只比较了对的浮动部分.

令人惊讶的是,当在16M值上使用时,在std :: vector上它只需要大约1940毫秒,但在阵列上它大约是2190毫秒.谁能解释一下矢量怎么能更快?是由于缓存,还是只是std :: sort的数组版本实现不好?

gcc(GCC)4.4.5 20110214(Red Hat 4.4.5-6)

Intel(R)Core(TM)i7 cpu 870 @ 2.93GHz – 缓存大小8192 KB(计算机有两个四核cpu,但我认为排序只是单线程)

编辑:现在你可以叫我dumbass,但是当我试图重现我用于测量的代码时(我已经删除了原始代码)我无法重现结果 – 现在数组版本需要大约1915 – 5ms(测量32运行).我只能发誓我已经对10次测量进行了三次测试(手动)并得到了类似的结果,但这并不是一个严格的证据.

原始代码中可能存在一些错误,后台进程似乎无法进行,因为我已经交替测量了向量和数组版本,并且向量结果保持并且没有用户登录.

请将此问题视为已结束.谢谢你的努力.

解决方法

std::vector<std::pair<float,unsigned int>> (filled with push_back operation)

这可以保存所有数据,因此内存位置非常好

std::pair<float,unsigned int>> * array (allocated using new and then filled one by one)

这会将数据分散到整个内存中.

你已经在vector和一个简单数组之间建立了一个非常不公平的比较.数组中涉及的额外间接性会受到损害,缺少局部性会破坏缓存性能.我很惊讶你没有看到更大的胜利支持连续存储.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...