2010-04-09 17 views
12

He leído con interés la publicación C difference between malloc and calloc. Estoy utilizando malloc en mi código y me gustaría saber qué diferencia tendré con el uso de calloc.calloc v/s malloc y eficiencia de tiempo

Mi presente (pseudo) código con malloc:

Escenario 1

int main() 
{ 
    allocate large arrays with malloc 

    INITIALIZE ALL ARRAY ELEMENTS TO ZERO 

    for loop //say 1000 times 
    do something and write results to arrays 
    end for loop 

    FREE ARRAYS with free command 

} //end main 

Si uso calloc en lugar de malloc, entonces tendré:

Scenario2

int main() 
{ 

    for loop //say 1000 times 
    ALLOCATION OF ARRAYS WITH CALLOC 

    do something and write results to arrays 

    FREE ARRAYS with free command 

    end for loop 


} //end main 

Tengo tres preguntas:

  1. ¿Cuál de los escenarios es más eficiente si las matrices son muy grandes?

  2. ¿Cuál de los escenarios será más eficiente en el tiempo si las matrices son muy grandes?

  3. En ambos casos, solo estoy escribiendo en matrices en el sentido de que para cualquier iteración dada en el ciclo for, estoy escribiendo cada matriz secuencialmente desde el primer elemento hasta el último elemento. La pregunta importante: si estoy utilizando malloc como en el escenario 1, entonces ¿es necesario que inicialice los elementos a cero? Decir con malloc tengo array z = [garbage1, garbage2, garbage 3]. Para cada iteración, estoy escribiendo elementos secuencialmente, es decir, en la primera iteración obtengo z = [some_result, garbage2, garbage3], en la segunda iteración que obtengo en la primera iteración obtengo z = [some_result, another_result, garbage3] y así encendido, entonces ¿necesito específicamente inicializar mis matrices después de malloc?

+0

posible duplicado de http://stackoverflow.com/questions/1538420/c-difference-between-malloc-and-calloc –

+0

Sí, esta es la razón por la que mencioné que leí la otra publicación. Yo quería ser un poco más específico aquí. – yCalleecharan

+0

¿Lo has medido tú mismo? ¿Cuáles fueron los resultados en su máquina? – Secure

Respuesta

9

Suponiendo que la cantidad total de memoria que se está inicializada en su dos ejemplos es lo mismo, la asignación de la memoria con calloc() podría ser más rápido que la asignación de la memoria con malloc() y luego puesta a cero a cabo en una etapa distinta, sobre todo si en el caso malloc() usted pone a cero los elementos individualmente al iterar sobre ellos en un bucle. A malloc() seguido de memset() probablemente sea tan rápido como calloc().

Si no le importa que los elementos de la matriz sean basura antes de que realmente almacene los resultados del cálculo en ellos, no hay necesidad de inicializar realmente sus matrices después de malloc().

+0

Genial. Una pregunta: ¿memset() hace que la inicialización sea cero o NULL? – yCalleecharan

+0

Estoy usando C. Creo que memset() es para C++ y no está disponible en C. – yCalleecharan

+15

Usted piensa equivocado. memset() está disponible en C. – Secure

1

Para 1 y 2, ambos hacen lo mismo: asignar y cero, luego usar las matrices.

Para 3, si no necesita poner a cero las matrices primero, entonces la puesta a cero es innecesaria y no hacerlo es más rápido.

Existe la posibilidad de que la puesta a cero de calloc sea más eficiente que el código que se escribe, pero esta diferencia será pequeña en comparación con el resto del trabajo del programa. El ahorro real de calloc no es tener que escribir ese código usted mismo.

+0

Gracias por sus comentarios interesantes. – yCalleecharan

0

Los enfoques calloc y memset deberían ser aproximadamente iguales, y tal vez un poco más rápidos que el ajuste a cero.

Independientemente, todo es relativo a lo que haces dentro de tu lazo principal, que podría ser de órdenes de magnitud mayor.

+0

Gracias. Lo que sucede dentro del ciclo puede consumir mucho más tiempo. – yCalleecharan

0

Su punto indicado en 3. parece indicar un caso o una inicialización innecesaria. Eso es bastante lento en cuanto a la velocidad, no solo se desperdicia el tiempo dedicado a hacerlo, sino que se produce una gran cantidad de desalojos de memoria caché por eso.

Hacer un memset() o bzero() (que son llamados por calloc() de todos modos) es una buena manera de invalidar gran parte de su caché. No lo haga a menos que esté seguro de que no sobrescribirá todo pero puede leer partes del búfer que no se hayan escrito (como si 0 fuera un valor predeterminado aceptable). Si escribe todo de todos modos significa no inicializar su memoria innecesariamente.

La escritura de memoria innecesaria no solo arruinará el rendimiento de su aplicación, sino también el rendimiento de todas las aplicaciones que comparten la misma CPU con ella.

+0

Gracias por su aporte interesante. – yCalleecharan

-7

malloc difieren en calloc por dos razones

  1. malloc toma un argumento mientras que calloc toma dos argumentos

  2. malloc es más rápida que la razón calloc es que malloc procesado matriz unidimensional a formato puntero mientras que calloc toma una matriz doble dimensional y antes de ser procesada convierte a una matriz dimensional única y luego a un formato de puntero.

Creo que, por eso malloc un procesamiento más rápido en comparación con calloc

Cuestiones relacionadas