Pregunta

Mientras bucle a través de líneas en el archivo A, Estoy analizar la línea y poner cada cadena (char*) en un char**.

Al final de una línea, que a continuación, ejecutar un procedimiento que consiste en abrir el archivo B, utilizando fgets, fseek y fgetc para agarrar los personajes de ese archivo. Me continuación, cierre el archivo B.

repito reapertura y volver a cerrar el archivo B para cada línea.

Lo que me gustaría saber es:

  1. ¿Hay un impacto de rendimiento significativos en el uso malloc y free, de tal manera que yo debería usar algo estático, como myArray[NUM_STRINGS][MAX_STRING_WIDTH] en lugar de un char** myArray dinámica?

  2. ¿Hay significativa sobrecarga de rendimiento de apertura y cierre de archivos B (Conceptualmente, muchos miles de veces)? Si se ordena mi archivo A, hay una manera para que yo use fseek para moverse "hacia atrás" en el archivo B, para restablecer donde estaba previamente situado en el archivo B?

editar Resulta que un enfoque de dos veces reducido en gran medida el tiempo de ejecución:

  1. Mi archivo B es en realidad una de las veinticuatro archivos. En lugar de abrir el mismo archivo B1 mil veces, y luego B2 mil veces, etc. abro archivo B1 vez, cerrarla, B2 vez, la cierran, etc. Esto reduce muchos miles de operaciones y fopen fclose a más o menos 24.

  2. He utilizado rewind() para restablecer el puntero de archivo.

Esto produjo una mejora de la velocidad más o menos de 60 veces, que es más que suficiente. Gracias por señalarme a rewind().

¿Fue útil?

Solución

Si su matriz dinámica crece en el tiempo, hay un costo de copia en algunos reallocs. Si utiliza la heurística "siempre doble", esto es amortizado a O (n), por lo que no es horrible. Si conoce el tamaño antes de tiempo, una matriz de pila asignado todavía será más rápido.

Para la segunda pregunta leído sobre rewind. Tiene que ser más rápido que la apertura y el cierre de todo el tiempo, y le permite hacer menos la gestión de recursos.

Otros consejos

Lo que me gustaría saber es:

  • funciona su código correctamente?
  • está funcionando lo suficientemente rápido para su propósito?

Si la respuesta tanto de ellos es "sí", no cambia nada.

La apertura y cierre tiene una sobrecarga variable en función de si otros programas están competitng para ese recurso.

medir el tamaño del archivo primero y luego utilizar eso para calcular el tamaño de la matriz con antelación para hacer una gran asignación del montón.

Usted no recibe una matriz multidimensional de inmediato, pero un poco de aritmética de punteros y estás allí.

no se puede almacenar en caché la información de posición en el otro archivo y, a continuación, en lugar de abrir y cerrar, utilice anterior Buscar índices como un desplazamiento? Depende de la lógica exacta verdad.

  1. Si los archivos son grandes, / S de disco será mucho más caro que la gestión de memoria. Preocuparse por malloc / rendimiento sin antes perfiles indica que es un cuello de botella es la optimización prematura.

  2. Es posible que la cabeza de la frecuente apertura / cierre es significativo en su programa, pero de nuevo es probable que sea más caro es el de E / S real, a menos que los archivos son pequeñas, en cuyo caso la pérdida de tampones entre cerrar y abrir potencialmente puede causar extra de disco I / O. Y sí se puede utilizar ftell () para obtener la posición actual en un archivo y luego fseek con SEEK_SET para llegar a eso.

Siempre hay un impacto en el rendimiento con el uso de la memoria dinámica. El uso de un buffer estático proporcionará un impulso de velocidad.

También va a haber un impacto en el rendimiento con volver a abrir un archivo. Puede utilizar fseek (POS, SEEK_SET) para establecer el puntero del archivo a cualquier posición en el archivo o fseek (offset, SEEK_CUR) para hacer un movimiento relativo.

rendimiento significativo éxito es relativo, y usted tendrá que determinar lo que esto significa para usted mismo.

  1. Creo que es mejor para asignar el el espacio real que necesita, y el gastos generales probablemente no será significativo. Esto evita tanto desperdiciar espacio y desbordamientos de pila

  2. Sí. Aunque la IO se almacena en caché, usted está haciendo llamadas al sistema innecesarios (abrir y cerrar). Utilizar con fseek Probablemente SEEK_CUR o SEEK_SET.

En ambos casos, no es algunos impacto en el rendimiento, pero la importancia dependerá del tamaño de los archivos y el contexto de su programa se ejecuta en.

  1. Si realmente conoce el número máximo de cadenas y anchura máxima, esto va a ser mucho más rápido (pero puede perder una gran cantidad de memoria si se utiliza menos que el "máximo"). El término medio es hacer lo que una gran cantidad de implementaciones de matriz dinámica en C ++ hacer: cada vez que tiene que realloc miMatriz, alloc el doble de espacio como sea necesario, y sólo REALLOC de nuevo una vez que haya quedado sin espacio. Esto tiene O (log n) costo de rendimiento.

  2. Esto puede ser un gran impacto en el rendimiento. Recomiendo encarecidamente el uso de fseek, aunque los detalles dependerán de su algoritmo.

A menudo encuentro la sobrecarga de rendimiento al ser superado por la gestión de memoria directa que viene con malloc y los controladores de bajo nivel C en la memoria. A menos que estas áreas de la memoria van a permanecer estático y sin tocar durante una cantidad de tiempo que está en el tiempo amortizado mayor que tocar esta memoria, puede ser más beneficioso para seguir con la matriz estática. Al final, le toca a usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top