【发布时间】:2017-04-06 11:22:34
【问题描述】:
我有两个程序,用 g++ 编译并在 linux 上执行。程序 1 创建一个二维数组,然后测量访问其所有元素 100000 次需要多长时间:
#include <time.h>
#include <iostream>
int main()
{
clock_t time;
int i, y, x;
int matrix[9][9]{{ 0, 1, 2, 3, 4, 5, 6, 7, 8},
{ 9, 10, 11, 12, 13, 14, 15, 16, 17},
{18, 19, 20, 21, 22, 23, 24, 25, 26},
{27, 28, 29, 30, 31, 32, 33, 34, 35},
{36, 37, 38, 39, 40, 41, 42, 43, 44},
{45, 46, 47, 48, 49, 50, 51, 52, 53},
{54, 55, 56, 57, 58, 59, 60, 61, 62},
{63, 64, 65, 66, 67, 68, 69, 70, 71},
{72, 73, 74, 75, 76, 77, 78, 79, 80}};
time = clock();
for (i = 0; i < 100000; i++)
{
for (x = 0; x < 9; x++)
{
for (y = 0; y < 9; y++)
{
matrix[x][y];
}
}
}
time = clock() - time;
std::cout << "Clicks: " << time << std::endl;
std::cout << "Time taken: " << (double) time / CLOCKS_PER_SEC << "s" << std::endl;
}
程序 2 创建一个一维数组,并测量访问其所有元素 100000 次所需的时间:
#include <time.h>
#include <iostream>
int main()
{
clock_t time;
int i, j;
int vector[81] = { 0, 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44,
45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 62,
63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76, 77, 78, 79, 80};
time = clock();
for (i = 0; i < 100000; i++)
{
for (j = 0; j < 81; j++)
{
vector[j];
}
}
time = clock() - time;
std::cout << "Clicks: " << time << std::endl;
std::cout << "Time taken: " << (double) time / CLOCKS_PER_SEC << "s" << std::endl;
}
执行程序 1 后,我的输出是:
Clicks: 8106
Time taken: 0.008106s
执行程序 2 后,我的输出是:
Clicks: 15958
Time taken: 0.015958s
据我了解,一维数组存储在连续的内存块中。同样,静态二维数组的行存储在连续的内存块中。相反,动态二维数组的行可能不会存储在连续的内存块中。如果这是真的,那么程序 2 的速度应该至少与程序 1 相似,因此我的问题是为什么程序 1 会比程序 2 快得多?
【问题讨论】:
-
如果我错了,请纠正我,但 c 对待 2d 和 1d 数组的处理方式不一样吗?
-
你在什么编译器和操作系统上测试过它?
-
@KyleKW 我相信是这样,但索引会有所不同,即在二维数组中,您使用索引 = 宽度 * 列索引 + 行索引访问每个元素。我关心的是为什么二维数组的访问速度比一维数组快。
-
按照我所说的,你可能想看看这个answer(第2和第3段是关于缓存和prefetching)
-
试图测量如此短时间的性能通常会由于其他进程引起的噪音而产生偏差 - 调度程序管理 10-20 毫秒级别的上下文切换,因此您需要至少一个量级的测试更慢,因为它没有效果。将迭代次数增加到
10000000后,我得到了相反的结果:4.69s用于 2D 数组,3.44s用于 1D 数组,两种情况下的测量误差均小于 1%。
标签: c++ arrays performance matrix vector