Können einige das Leistungsverhalten des folgenden Speicherzuweisungs-C-Programms erklären?
Auf meinem Rechner tauschen Zeit A und Zeit B je nachdem obA
definiert ist oder nicht (was die Reihenfolge ändert, in der die beidencalloc
s heißen).
Ich schrieb dies anfangs dem Funkrufsystem zu. Komisch, wannmmap
wird anstelle von verwendetcalloc
ist die Situation noch bizarrer - beide Loops benötigen erwartungsgemäß die gleiche Zeit. Wie man sehen kann mitstrace
, dascalloc
s führt letztendlich zu zweimmap
s, so dass keine Rückkehr-bereits-zugewiesene-Speichermagie vor sich geht.
Ich führe Debian-Tests auf einem Intel i7 aus.
<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>
Die Ausgabe bekomme ich:
<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>