为了量化在C ++中的C-状阵列和载体的性能上的差异,我写这个小程序。 https://github.com/rajatkhanduja/Benchmarks/blob/master/C%2B%2B/vectorVsArray.cpp
为了比较它们的共同点,我决定测试都为随机和顺序访问。 我加了迭代器,只是他们比较,以及(但不是问题的主要论点集中在什么)。
结果,对于一个64位Linux机器与7.7 GB的RAM上的百万的阵列/矢量大小如下: -
- 所用时间写入阵列。 :12.0378毫秒
- 时间取自顺序阵列读取。 :2.48413毫秒
- 时间采取从随机阵列读。 :37.3931毫秒
- 所用时间写入动态数组。 :11.7458毫秒
- 时间取自动态数组顺序来阅读。 :2.85107毫秒
- 时间采取从动态随机阵列读。 :36.0579毫秒
- 所用时间编写使用索引来载体。 :11.3909毫秒
- 所用时间用指数从载体读取顺序。 :4.09106毫秒
- 所用时间用指数从载体读取,随机。 :39毫秒
- 所用时间编写出使用迭代器载体。 :24.9949毫秒
- 所用时间使用向量迭代器阅读。 :18.8049毫秒
向量的大小设置在初始化的时间,而不是改变,所以没有矢量的大小调整(在节目中断言有助于验证)。 该时间不包括任何静态分配阵列的初始化时间,动态分配的数组或载体中。
据统计,写入向量的时间比该阵列但是从向量读取时间的较小的两倍该数组的。
所不同的是非常小的,但有一个解释,为什么有性能差异? 是不是有什么毛病的考验吗? 我希望既能以相同的速度进行。 本次测试的重复显示了同样的趋势。
代码:
#include <vector>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <sys/time.h>
#include <cassert>
#define ARR_SIZE 1000000
using std::string;
void printtime (struct timeval& start, struct timeval& end, string str);
int main (void)
{
int arr[ARR_SIZE];
int tmp;
struct timeval start, stop;
srand (time (NULL));
/* Writing data to array */
gettimeofday (&start, NULL);
for (int i = 0; i < ARR_SIZE; i++)
{
arr[i] = rand();
}
gettimeofday (&stop, NULL);
printtime (start, stop, string ("Time taken to write to array."));
/* Reading data from array */
gettimeofday (&start, NULL);
for (int i = 0; i < ARR_SIZE; i++)
{
tmp = arr[i];
}
gettimeofday (&stop, NULL);
printtime (start, stop, string ("Time taken to read from array sequentially."));
/* Reading data from array randomly*/
gettimeofday (&start, NULL);
for (int i = 0; i < ARR_SIZE; i++)
{
tmp = arr[rand() % ARR_SIZE];
}
gettimeofday (&stop, NULL);
printtime (start, stop, string ("Time taken to read from array randomly."));
int *darr = (int *) calloc (sizeof (int), ARR_SIZE);
/* Writing data to array */
gettimeofday (&start, NULL);
for (int i = 0; i < ARR_SIZE; i++)
{
darr[i] = rand();
}
gettimeofday (&stop, NULL);
printtime (start, stop, string ("Time taken to write to dynamic array."));
/* Reading data from array */
gettimeofday (&start, NULL);
for (int i = 0; i < ARR_SIZE; i++)
{
tmp = darr[i];
}
gettimeofday (&stop, NULL);
printtime (start, stop, string ("Time taken to read from dynamic array sequentially."));
/* Reading data from dynamic array randomly*/
gettimeofday (&start, NULL);
for (int i = 0; i < ARR_SIZE; i++)
{
tmp = darr[rand() % ARR_SIZE];
}
gettimeofday (&stop, NULL);
printtime (start, stop, string ("Time taken to read from dynamic array randomly."));
std::vector<int> v(ARR_SIZE);
assert (v.capacity() == ARR_SIZE);
/* Writing to vector using indices*/
gettimeofday (&start, NULL);
for (int i = 0; i < ARR_SIZE; i++)
{
v[i] = rand();
}
gettimeofday (&stop, NULL);
printtime (start, stop, string ("Time taken to write to vector using indices."));
assert (v.capacity() == ARR_SIZE);
/* Reading from vector using indices*/
gettimeofday (&start, NULL);
for (int i = 0; i < ARR_SIZE; i++)
{
tmp = v[i];
}
gettimeofday (&stop, NULL);
printtime (start, stop, string ("Time taken to read from vector using indices, sequentially."));
/* Reading data from dynamic array randomly*/
gettimeofday (&start, NULL);
for (int i = 0; i < ARR_SIZE; i++)
{
tmp = v[rand() % ARR_SIZE];
}
gettimeofday (&stop, NULL);
printtime (start, stop, string ("Time taken to read from vector using indices, randomly."));
std::vector<int> v2(ARR_SIZE);
/* Writing to vector using iterators*/
gettimeofday (&start, NULL);
std::vector<int>::iterator itr, itr_end;
for (itr = v2.begin(), itr_end = v2.end(); itr != itr_end; itr++)
{
*itr = rand();
}
gettimeofday (&stop, NULL);
printtime (start, stop, string ("Time taken to write to vector using iterators."));
/* Reading from vector using iterators*/
gettimeofday (&start, NULL);
for (itr = v2.begin(), itr_end = v2.end(); itr != itr_end; itr++)
{
tmp = *itr;
}
gettimeofday (&stop, NULL);
printtime (start, stop, string ("Time taken to read from vector using iterators."));
return 0;
}
void printtime (struct timeval& start, struct timeval& end, string str)
{
double start_time, end_time, diff;
start_time = ((start.tv_sec) * 1000 + start.tv_usec/1000.0);
end_time = ((end.tv_sec) * 1000 + end.tv_usec/1000.0);
diff = end_time - start_time;
std::cout << str << " : " << diff << " ms" << std::endl;
}
编辑
正如评论所说,这里是详细信息: -
- 编译器: - 克++ - 4.5.2
- 标志: - 无(即默认值)
- 优化: - 无(我想测试在通常的设置中的行为优化可以改变程序的行为,例如由于一点也没有使用的变量TMP,读取向量/阵列的步骤可以完全被跳过或减小到。刚刚过去的分配。至少这是我的理解)。