¿Pueden algunos explicar el comportamiento de rendimiento del siguiente programa de asignación de memoria C?
En mi máquina, el tiempo A y el tiempo B cambian dependiendo de siA
está definido o no (lo que cambia el orden en que los doscalloc
s se llaman).
Inicialmente atribuí esto al sistema de paginación. Extrañamente, cuandommap
se utiliza en lugar decalloc
, la situación es aún más complicada: ambos bucles llevan la misma cantidad de tiempo, como se esperaba. Como se puede ver constrace
, lacalloc
s finalmente el resultado en dosmmap
s, así que no hay ninguna magia de memoria de retorno ya asignada en marcha.
Estoy ejecutando las pruebas de Debian en un 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>
La salida que obtengo:
<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>