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 beidencallocs heißen).

Ich schrieb dies anfangs dem Funkrufsystem zu. Komisch, wannmmap wird anstelle von verwendetcallocist die Situation noch bizarrer - beide Loops benötigen erwartungsgemäß die gleiche Zeit. Wie man sehen kann mitstrace, dascallocs führt letztendlich zu zweimmaps, 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>

Antworten auf die Frage(5)

Ihre Antwort auf die Frage