Agradecemos tu apoyo para difundir nuestras reseñas referente a las ciencias de la computación.
Solución:
Si bien este punto de referencia no es definitivo, ya que la gestión de la memoria varía según los diferentes sistemas, hoy en día las cosas tienden a estar bastante estandarizadas, por lo que estos resultados deberían sea seguro usarlo como punto de referencia (si conoce un caso de la vida real que no lo es, por favor dígamelo). Estoy usando Windows 7 en un QuadCore Intel Core i3 2310M de 2,10 GHz con 4 GB de RAM. No es el mejor hardware de la historia, pero es el mejor que tengo ahora.
Lo que hace este punto de referencia es que comienza con una cierta cantidad de memoria (INITIAL_MEMORY) y reasigna repetidamente en pequeñas cantidades (BYTE_STEP) hasta que asigna/desasigna completamente ALLOCATE_MEMORY. Para ello, intenta 6 enfoques:
- Incrementando Lossful Malloc: free() y malloc() más memoria.
- Reducción de Malloc con pérdidas: free() y malloc() menos memoria.
- Aumentar Malloc: malloc() más memoria, copiar datos y liberar() memoria anterior.
- Malloc decreciente: malloc() menos memoria, copiar datos y liberar() memoria anterior.
- Aumento de Realloc: realloc() más memoria.
- Realloc decreciente: realloc() menos memoria.
Entonces, primera prueba: comience con 2 MB y asigne ± 1 MB en pasos de 1 KB:
Increasing Lossful Malloc took 3 ms
Decreasing Lossful Malloc took 5 ms
Increasing Malloc took 1 265 ms
Decreasing Malloc took 744 ms
Increasing Realloc took 316 ms
Decreasing Realloc took 0 ms
Como podemos ver, copiar manualmente con memcpy es siempre más lento que realloc, porque en este escenario se garantiza que malloc asignará nueva memoria y está obligado a copiar los datos en cada asignación, lo que nos muestra que realloc está reutilizando la misma dirección y agrandando el tamaño del bloque en algunos casos. Entonces, si desea conservar sus datos, probablemente lo que desee usar sea realloc. Para simplificar las cosas, no seguiré probando este enfoque malloc sin pérdidas.
Pasemos a la siguiente prueba: memoria inicial de 32 MB, asignación de 16 MB en pasos de 16 KB:
Increasing Lossful Malloc took 4 ms
Decreasing Lossful Malloc took 4 ms
Increasing Realloc took 21 453 ms
Decreasing Realloc took 0 ms
Ahora, podemos ver que aumentar la reasignación requiere mucho de tiempo en comparación con las otras pruebas. La disminución de realloc ni siquiera ha alcanzado 1 ms. Esto muestra que si no desea mantener su memoria, debe usar un enfoque libre->malloc, ¿o no? Mira estos resultados:
Increasing Lossful Malloc took 777 ms
Decreasing Lossful Malloc took 729 ms
Decreasing Realloc took 19 ms
(Estos resultados fueron demasiado parecidos, así que realicé varias pruebas y promedié).
Definitivamente disminuir el tamaño de la memoria es más eficiente cuando se usa realloc(). Probablemente se deba a que realloc no necesita buscar un nuevo bloque de memoria, solo usa el anterior y lo reduce. Esto es un grande diferencia en el rendimiento si está utilizando la asignación en gran medida.
Además, podemos ver que el malloc creciente es ligeramente más lento que el decreciente, incluso cuando ambos hacen básicamente lo mismo: encontrar un bloque de memoria y asignarlo. Esta diferencia probablemente se deba a que cuando busca bloques más grandes, malloc necesita buscar más tiempo en promedio que cuando busca bloques más pequeños. Por ejemplo, si hay un bloque de 30 MB, un malloc que asigne 16 MB lo usaría, pero un malloc que asigne 32 MB tendría que omitirlo y seguir buscando y consumiendo tiempo. Esta es probablemente la razón por la cual los resultados variaron tanto en mis pruebas.
En conclusión/TLDR:
- Si necesita conservar sus datos, utilice realloc(). Es ~4 veces más rápido que usar malloc()/free() y copiar sus datos cuando ampliar. Al escalar abajo es 10.000-100.000 veces más rápido. NUNCA copiar cosas manualmente.
- Si usted no necesita conservar sus datos, debe usar malloc()/free() para aumentar proporcionalmente (aumentando el tamaño de la memoria) pero use realloc() cuando descendiendo (reduciendo el tamaño de la memoria).
- Si no conoce el tamaño anterior (no sabe si está escalando hacia abajo o hacia arriba), use malloc()/free(). Cuando se reduce, realloc() es ~40 veces más rápido, pero cuando se amplía, realloc() es ~7600 veces más lento. A menos que su programa haga algunas asignaciones enormes y toneladas de pequeñas desasignaciones (~200 veces más desasignaciones que asignaciones, lo que puede ser posible), debe usar malloc()/free().
Aquí está mi fuente de referencia: test.cpp
La ventaja es que realloc preservará el contenido de la memoria. Con free + malloc necesitaría restablecer los datos en el array.
Bueno, realloc puede cambiar el tamaño del bloque en su lugar, o asignar uno nuevo y copiar todo lo que quepa. Por el contrario, malloc y free juntos solo pueden asignar uno nuevo, y usted tiene que hacer su propia copia.
Para ser sincero, realloc no tiene tanto uso en estos días porque no funciona bien con C++. Como resultado, ha habido una tendencia a que los administradores de memoria no se optimicen.
Te mostramos las reseñas y valoraciones de los usuarios
Si posees alguna desconfianza o capacidad de afinar nuestro post puedes ejecutar una crónica y con deseo lo estudiaremos.