Почему следующие два кода дают разные результаты? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть два похожих кода ниже.

1-й код:

unsigned long size = 2561024;
unsigned long stride = 256;
void *array = (void*)malloc(size);
for (unsigned long off = 0; off < size; off+=stride) {
    *(unsigned int*)(array+off) = off+stride;
}
*(unsigned int*)(array+off)=0;
int i=10000000;
struct timeval start, end;
gettimeofday(&start, NULL);
while (i>=1) {
    offset = *(unsigned int*)(array+off);
    i--;
}
gettimeofday(&end, NULL);
*(volatile unsigned int*)(array+offset);
printf("%.2f\n", (end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec));

2-й код:

unsigned long size = 256*1024*1024;
unsigned long stride = 256;
void *array = (void*)malloc(size);
for (unsigned long off = 0; off < size; off+=stride) {
    *(unsigned int*)(array+off) = off+stride;
}
*(unsigned int*)(array+off)=0;
int i=10000000;
struct timeval start, end;
gettimeofday(&start, NULL);
#define ONE offset = *(unsigned int*)(array+off);
#define FIVE ONE ONE ONE ONE ONE
#define TEN FIVE FIVE
#define FIFTY TEN TEN TEN TEN TEN
#define HUNDRED FIFTY FIFTY
while (i>=1000) {
    HUNDRED
    HUNDRED
    HUNDRED
    HUNDRED
    HUNDRED
    HUNDRED
    HUNDRED
    HUNDRED
    HUNDRED
    HUNDRED
    i-=1000;
}
gettimeofday(&end, NULL);
*(volatile unsigned int*)(array+offset);
printf("%.2f\n", (end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec));

Вопрос

Единственное различие между двумя кодами заключается в «цикле while».Они оба измеряют истекшее время для цикла while.

Первый код дает результат 779 851 000 нс, а второй код - 1 644 344 000 нс.(В 2,1 раза больше)

Я думал, что это различие связано с отсутствием кеш-памяти L1-i, поэтому я измерил пропадания кеш-памяти L1-i с помощью perf.первый код - 34 541, а второй кэш L1-i - 43 078.(В 1,2 раза больше)

*1024* Этот результат не может полностью объяснить разницу в затраченном времени для цикла while.

В чем заключается большая разница между затраченным временем двух кодов?

Есть что-нибудь, что я скучаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...