【发布时间】:2014-04-06 22:36:13
【问题描述】:
结果:
向量时间:7051
阵列时间:18944
我为此使用了 MSVC 发布模式,编译为 32 位。
在此测试之前,我查看了向量的 GCC 源代码并感到惊讶,因为我认为 operator[] 检查了数组越界,但事实并非如此。不过,没想到向量这么快?!
完整代码:
#include <iostream>
#include <vector>
int main(){
const int size = 10000;
unsigned long long my_array[size];
std::vector<unsigned long long> my_vec;
my_vec.resize(size);
//Populate containers
for(int i=0; i<size; i++){
my_vec[i] = i;
my_array[i] = i;
}
//Initialise test variables
unsigned long long sum = 0;
unsigned long long time = 0;
unsigned long long start = 0;
unsigned long long finish = 0;
//Time the vector
start = __rdtsc();
for(int i=0; i<size; i++){
sum += my_vec[i];
}
finish = __rdtsc();
time = finish - start;
std::cout << "Vector time: " << time << " " << sum << std::endl;
sum = 0;
//Time the array
start = __rdtsc();
for(int i=0; i<size; i++){
sum += my_array[i];
}
finish = __rdtsc();
time = finish - start;
std::cout << "Array time: " << time << " " << sum << std::endl;
int t = 8;
std::cin >> t;
return 0;
}
【问题讨论】:
-
当我测试它时,数组总是更快。向量时间:83755,数组时间:69753。当然,执行之间的值会有所不同,但不会太大。
-
尝试恢复这些测试。惊喜!
-
@user997112:在向量的情况下,您在填充后立即读取它。在数组的情况下,在数组填充和数组读取之间有一个完整的向量读取循环。
-
也许比另一种更快的测试更好的方法是创建两个单独的程序,其中一个严格来说是
standard C array,另一个严格来说是std::vector。从算法上讲,这两个程序都必须运行完全相同的测试。 -
除非您将进程固定到特定内核,否则您不能信任 TSC 测量结果,即使这样您也需要确保您使用的内在函数也省略了阻止指令的指令(例如 CPUID)在执行管道中重新排序(因此您尝试测量的代码相对于 TSC 读取进行序列化)。这个基准是不可信的。
标签: c++ arrays performance optimization vector