use*_*112 2 c++ arrays optimization performance vector
结果:
矢量时间: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;
}
Run Code Online (Sandbox Code Playgroud)
kva*_*nck 10
以下是使用MSVC 2013.
对于矢量:
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)
}
Run Code Online (Sandbox Code Playgroud)
对于数组:
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)
}
Run Code Online (Sandbox Code Playgroud)
如您所见,内环是相同的.实际上,怀疑它是硬件的东西,我交换了两个循环,并且数组更快地到达相同的边距(实际上,在现实世界中,它们都不比其他更快或更慢).
我预测这是某种CPU缓存行为:https: //en.wikipedia.org/wiki/CPU_cache
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |