У меня есть два похожих кода ниже.
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.
В чем заключается большая разница между затраченным временем двух кодов?
Есть что-нибудь, что я скучаю?