为什么数组比向量快得多
Why is an array so much faster than a vector?
这是比较向量和数组的公平测试吗?速度上的差异似乎太大了。我的测试表明这个数组的速度是原来的10到100倍!
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <windows.h>
#include <stdint.h>
using namespace std;
double PCFreq = 0.0;
__int64 CounterStart = 0;
using namespace std;
void StartCounter()
{
LARGE_INTEGER li;
if(!QueryPerformanceFrequency(&li))
std:cout << "QueryPerformanceFrequency failed!n";
PCFreq = double(li.QuadPart)/1000000000;
QueryPerformanceCounter(&li);
CounterStart = li.QuadPart;
}
double GetCounter()
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
return double(li.QuadPart-CounterStart)/PCFreq;
}
int _tmain(int argc, _TCHAR* argv[])
{
//Can do 100,000 but not 1,000,000
const int vectorsize = 100000;
cout.precision(10);
StartCounter();
vector<int> test1(vectorsize);
for(int i=0; i<vectorsize; i++){
test1[i] = 5;
}
cout << GetCounter() << endl << endl;
StartCounter();
int test2[vectorsize];
for(int i=0; i<vectorsize; i++){
test2[i] = 5;
}
cout << GetCounter() << endl << endl;
cout << test2[0];
int t = 0;
cin >> t;
return 0;
}
这取决于您要比较的内容。
您的基准测试同时测量设置时间和访问次数。毫无疑问,std::vector
具有更昂贵的设置时间。这是因为它需要分配内存,然后(根据标准的需要)调用所有元素的默认构造函数。对于POD类型,意味着归零。
因此,如果你试图测量访问时间,那么不,你的基准测试是不准确的。
以下是一些需要消化的数字:
原始代码:
StartCounter();
vector<int> test1(vectorsize);
for(int i=0; i<vectorsize; i++){
test1[i] = 5;
}
cout << GetCounter() << endl << endl;
时间:444353.5206
在声明和初始化vector
:之后开始计时
vector<int> test1(vectorsize);
StartCounter();
for(int i=0; i<vectorsize; i++){
test1[i] = 5;
}
cout << GetCounter() << endl << endl;
时间:15031.76101
对于阵列:
StartCounter();
int test2[vectorsize];
for(int i=0; i<vectorsize; i++){
test2[i] = 5;
}
cout << GetCounter() << endl << endl;
时间:38129.345
无论声明是否定时,时间都大致相同。这可能是因为堆栈分配是在进入函数时一次性完成的。
基本上,矢量内存分配和初始化花费了不成比例的时间。但实际的循环很快。
我还将注意到,您当前的基准框架仍然存在明显的缺陷。你只需要对每个数组进行一次遍历。因此,缓存效应和延迟分配将非常重要。
数组现在变慢的原因可能是由于延迟分配。数组已分配,但尚未提交。延迟分配意味着它在第一次访问时提交——这涉及到页面错误和到内核的上下文切换。
这里有一个更公平的测试,使用外循环来增加基准时间:
vector<int> test1(vectorsize);
StartCounter();
for (int c = 0; c < 10000; c++){
for(int i=0; i<vectorsize; i++){
test1[i] = 5;
}
}
cout << GetCounter() << endl << endl;
时间:227330454.6
int test2[vectorsize];
memset(test2,0,sizeof(test2));
StartCounter();
for (int c = 0; c < 10000; c++){
for(int i=0; i<vectorsize; i++){
test2[i] = 5;
}
}
cout << GetCounter() << endl << endl;
cout << test2[0];
时间:212286228.2
因此,对于稳态访问,没有一个数组比向量快NOT。这只是一个棘手的基准测试。
相关文章:
- 为什么通过引用返回向量比通过移动返回要快得多?
- 禁用优化后,quick-bench.com 基准测试要快得多
- C++ OpenMP 斐波那契:1 个线程的执行速度比 4 个线程快得多
- 为什么迭代 std::array 比迭代 std::vector 快得多?
- 为什么<wstring>使用自定义 wcscmp 和 wmemcmp 比较器对向量进行排序比默认快得多?
- C 为什么在原始双阵列中的分配似乎比双变量分配要快得多
- Linux 在从文件中读取数据并放入矢量时比 Windows 快得多.txt.我将如何加速Windows以做同样的事情
- 为什么 C 数组比 std::array 快得多?
- 为什么 pcre 正则表达式比 c++11 正则表达式快得多
- 为什么数组比向量快得多
- 为什么 ifstream::read 比使用迭代器快得多
- 为什么其中一个比另一个快得多
- GDI+Image比C#Image快得多
- 为什么堆栈内存的 memcpy 比堆内存快得多
- 为什么使用TBB的OpenCV函数比基于Boost的实现快得多
- 为什么多个文件的编译速度比合并文件快得多
- 为什么Windows C++多线程IOPS比IOMeter快得多
- 为什么STL算法使用指针比std::向量迭代器快得多
- 为什么使用 mkdir () 函数比使用 system ('mkdir 路径')快得多?
- 为什么Eigens-mean()方法比sum()快得多