|
|
От: |
lpd
|
|
| Дата: | 10.01.17 10:55 | ||
| Оценка: |
-2
|
||
#include <iostream>
#include <chrono>
#include <stdlib.h>
using namespace std;
#define SIZE 1000*1000*1000
int *map1, *map2;
void test(int *map)
{
int *array = new int[SIZE];
int sum = 0;
for (int i=0; i<SIZE; i++)
sum += array[map[i]];
}
int main()
{
map1 = new int[SIZE];
for (int i=0;i<SIZE;i++)
map1[i] = i;
srand(time(0));
map2 = new int[SIZE];
for (int i=0;i<SIZE;i++)
map2[i] = random()%SIZE;
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";
}Да, разница на 20%. Однако здесь только одна операция суммирования чисел, так что это можно считать верхней границей выигрыша, которую дает кэш. В реальных программах обработки больше, да и обращение к данным далеко не всегда последовательное, поэтому кэш не играет такой роли. Тем более, ошибочно говорить, что кэш миссы — решающий фактор, определящий отставание Java/C# в скорости от C++.2203765521ns
2621904089ns