У меня есть две программы, скомпилированные с g ++ и исполняемые на linux. Программа 1 создает 2D массив, а затем измеряет, сколько времени требуется, чтобы получить доступ ко всем его элементам 100000 раз:Зачем нужен доступ к двумерному массиву быстрее, чем доступ к 1-му массиву?
#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 создает 1D массив, а также измеряет, сколько времени требуется, чтобы получить доступ ко всем его элементам 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
Насколько я понимаю, 1D-массив хранится в непрерывном блоке памяти. Аналогично, строки статического 2D-массива хранятся в смежных блоках памяти. И наоборот, строки динамического массива 2d могут не храниться в смежных блоках памяти. Если это так, то программа 2 должна быть как минимум схожа по скорости с программой 1, поэтому мой вопрос заключается в том, почему программа 1 будет значительно быстрее, чем программа 2?
Исправьте меня, если я ошибаюсь, но не обрабатывает ли 2d и 1d массивы почти одинаково? – KyleKW
Какой компилятор и ОС вы его тестировали? –
@KyleKW Я так считаю, но индексирование будет различным. В 2D-массиве вы получаете доступ к каждому элементу с индексом index = width * index index + row index. Меня беспокоит, почему бы 2D-массив был быстрее доступен, чем 1D-массив. – JeliBeanMachine