title: Can some explain the performance behavior of the following memory allocating C program?
body: <p>On my machine Time A and Time B swap depending on whether <code>A</code> is
  defined or not (which changes the order in which the two <code>calloc</code>s are called).</p>
  
  <p>I initially attributed this to the paging system. Weirdly, when
  <code>mmap</code> is used instead of <code>calloc</code>, the situation is even more bizzare -- both the loops take the same amount of time, as expected.  As
  can be seen with <code>strace</code>, the <code>calloc</code>s ultimately result in two
  <code>mmap</code>s, so there is no return-already-allocated-memory magic going on.</p>
  
  <p>I'm running Debian testing on an Intel i7.</p>
  
  <pre><code>#include &lt;stdlib.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;sys/mman.h&gt;
  
  #include &lt;time.h&gt;
  
  #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 &lt; 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 &lt; SIZE; i++)
        arr2[i] = (i + 13) * 5;
    }
    finish = clock();
  
    printf("Time B: %.2f\n", ((double)(finish - start))/CLOCKS_PER_SEC);
  
    return 0;
  }
  </code></pre>
  
  <p>The output I get:</p>
  
  <pre><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></pre>