Czy niektórzy mogą wyjaśnić zachowanie wydajności następującego programu przydzielania pamięci C?
Na moim komputerze czas A i czas B zamieniają się w zależności od tego, czyA
jest zdefiniowane lub nie (co zmienia kolejność, w jakiej te dwacalloc
s są nazywane).
Początkowo przypisałem to do systemu stronicowania. Dziwnie, kiedymmap
jest używany zamiastcalloc
sytuacja jest jeszcze trudniejsza - obie pętle zajmują tyle samo czasu, co oczekiwano. Jak widać zstrace
, thecalloc
Ostatecznie wynik dwóchmmap
s, więc nie ma magii pamięci już przydzielonej do powrotu.
Używam testowania Debiana na Intel i7.
<code>#include <stdlib.h> #include <stdio.h> #include <sys/mman.h> #include <time.h> #define SIZE 500002816 #ifndef USE_MMAP #define ALLOC calloc #else #define ALLOC(a, b) (mmap(NULL, a * b, PROT_READ | PROT_WRITE, \ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)) #endif int main() { clock_t start, finish; #ifdef A int *arr1 = ALLOC(sizeof(int), SIZE); int *arr2 = ALLOC(sizeof(int), SIZE); #else int *arr2 = ALLOC(sizeof(int), SIZE); int *arr1 = ALLOC(sizeof(int), SIZE); #endif int i; start = clock(); { for (i = 0; i < SIZE; i++) arr1[i] = (i + 13) * 5; } finish = clock(); printf("Time A: %.2f\n", ((double)(finish - start))/CLOCKS_PER_SEC); start = clock(); { for (i = 0; i < SIZE; i++) arr2[i] = (i + 13) * 5; } finish = clock(); printf("Time B: %.2f\n", ((double)(finish - start))/CLOCKS_PER_SEC); return 0; } </code>
Wyjście, które otrzymuję:
<code> ~/directory $ cc -Wall -O3 bench-loop.c -o bench-loop ~/directory $ ./bench-loop Time A: 0.94 Time B: 0.34 ~/directory $ cc -DA -Wall -O3 bench-loop.c -o bench-loop ~/directory $ ./bench-loop Time A: 0.34 Time B: 0.90 ~/directory $ cc -DUSE_MMAP -DA -Wall -O3 bench-loop.c -o bench-loop ~/directory $ ./bench-loop Time A: 0.89 Time B: 0.90 ~/directory $ cc -DUSE_MMAP -Wall -O3 bench-loop.c -o bench-loop ~/directory $ ./bench-loop Time A: 0.91 Time B: 0.92 </code>