gpt4 book ai didi

c++ - 为什么 std::vector 是原始数组的两倍?包含完整代码

转载 作者:太空狗 更新时间:2023-10-29 23:40:06 26 4
gpt4 key购买 nike

结果:

Vector time: 7051

Array time: 18944

我为此使用了 MSVC Release模式,编译为 32 位。

在这个测试之前,我正在查看 vector 的 GCC 源代码并且感到惊讶,因为我认为 operator[] 检查数组越界,但它没有。然而,没想到vector这么快?!

完整代码:

#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;
}

最佳答案

以下是使用 MSVC 2013。

对于 vector :

0019138E  mov         edi,edi  
for (int i = 0; i<size; i++){
00191390 lea ecx,[ecx+20h]
sum += my_vec[i];
00191393 movdqu xmm0,xmmword ptr [ecx-20h]
00191398 paddq xmm1,xmm0
0019139C movdqu xmm0,xmmword ptr [ecx-10h]
001913A1 paddq xmm2,xmm0
001913A5 dec esi
001913A6 jne main+0F0h (0191390h)
}

对于数组:

0019142D  lea         ecx,[ecx]  
for (int i = 0; i<size; i++){
00191430 lea ecx,[ecx+20h]
sum += my_array[i];
00191433 movdqu xmm0,xmmword ptr [ecx-30h]
00191438 paddq xmm1,xmm0
0019143C movdqu xmm0,xmmword ptr [ecx-20h]
00191441 paddq xmm2,xmm0
00191445 dec esi
00191446 jne main+190h (0191430h)
}

如您所见,内部循环是相同的。实际上,我怀疑这是硬件问题,我交换了两个循环,结果数组以相同的幅度更快地出现(所以实际上,在现实世界中,两者都不比另一个更快或更慢)。

我预测这是某种 CPU 缓存行为: https://en.wikipedia.org/wiki/CPU_cache

关于c++ - 为什么 std::vector 是原始数组的两倍?包含完整代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22900868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com