|
|
От: |
lpd
|
|
| Дата: | 10.01.17 11:36 | ||
| Оценка: | |||
#include <iostream>
#include <chrono>
#include <stdlib.h>
using namespace std;
#define SIZE 1000*1000*1000
int *array;
int *map1, *map2;
void test(int *map)
{
int sum = 0;
for (int i=0; i<SIZE; i++)
sum += array[map[i]];
}
void test0()
{
int sum = 0;
for (int i=0; i<SIZE; i++)
sum += array[i];
}
int main()
{
srand(time(0));
array = new int[SIZE];
map1 = new int[SIZE];
for (int i=0;i<SIZE;i++) {
map1[i] = i;
array[i] = random();
}
map2 = new int[SIZE];
for (int i=0;i<SIZE;i++)
map2[i] = random()%SIZE;
auto start0 = std::chrono::high_resolution_clock::now();
test0();
auto finish0 = std::chrono::high_resolution_clock::now();
cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish0-start0).count() << "ns\n";
auto start1 = std::chrono::high_resolution_clock::now();
test(map1);
auto finish1 = std::chrono::high_resolution_clock::now();
cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish1-start1).count() << "ns\n";
auto start2 = std::chrono::high_resolution_clock::now();
test(map2);
auto finish2 = std::chrono::high_resolution_clock::now();
cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish2-start2).count() << "ns\n";
}Видим, что индирекция при суммировании дает всего 10% разницы.1952730354ns
2168493713ns
2623154650ns