Pregunta

Estoy escribiendo un programa en el que el rendimiento es bastante importante, pero no es crítico. Actualmente estoy leyendo en el texto de una línea por línea y FILE* utilizo fgets para obtener cada línea. Después de utilizar algunas herramientas de rendimiento, he encontrado que el 20% y el 30% de las veces mi aplicación se está ejecutando, está dentro de fgets.

¿Hay maneras más rápidas para conseguir una línea de texto? Mi solicitud es sin intenciones de utilizar múltiples hilos de un solo subproceso. De entrada podría ser de la entrada estándar o desde un archivo. Gracias de antemano.

¿Fue útil?

Solución

Usted no dice qué plataforma que se encuentra, pero si es de tipo UNIX, entonces es posible que desee probar la llamada al sistema read (), que no realiza la capa extra de almacenamiento temporal que fgets () y otros hacer. Esto puede acelerar las cosas un poco, por otro lado, puede también ralentizar las cosas -. La única manera de averiguarlo es intentarlo y ver

Otros consejos

  1. Uso fgets_unlocked (), pero leer cuidadosamente lo que hace primero

  2. Obtener los datos con fgetc () o fgetc_unlocked () en lugar de fgets (). Con fgets (), sus datos se copia en la memoria dos veces, primero por la biblioteca C de tiempo de ejecución de un archivo a un buffer interno (corriente I / O se almacenan temporalmente), a continuación, a partir de ese búfer interno a una matriz en su programa

Leer todo el archivo de una sola vez en un búfer.

Proceso de las líneas de esa memoria intermedia.

Esa es la solución más rápida posible.

Usted puede tratar de reducir al mínimo la cantidad de tiempo que pasa leyendo desde el disco mediante la lectura de grandes cantidades de datos en la RAM y luego trabajando en eso. La lectura del disco es lento, por lo que reducir al mínimo la cantidad de tiempo que pasa en que al leer (idealmente) el archivo completo una vez, luego a trabajar en él.

Sorta como la caché de manera CPU minimiza el tiempo de la CPU en realidad se remonta a la RAM, se puede utilizar la memoria RAM para reducir al mínimo el número de veces que realmente vaya a disco.

En función de su entorno, utilizando setvbuf () para aumentar el tamaño del búfer interno utilizado por secuencias de archivo puede o no mejorar el rendimiento.

Esta es la sintaxis -

setvbuf (InputFile, NULL, _IOFBF, BUFFER_SIZE);

Cuando InputFile es un archivo en un archivo * acaba de abrirse usando fopen () y BUFFER_SIZE es el tamaño de la memoria intermedia (que se le asigna en la presente convocatoria de usted).

Puede probar diferentes tamaños de memoria intermedia para ver si tienen influencia positiva. Tenga en cuenta que esto es totalmente opcional, y su tiempo de ejecución puede hacer absolutamente nada con esta llamada.

Si los datos proviene de disco, podría ser obligado IO.

Si ese es el caso, obtener un disco más rápido (pero primero compruebe que está obteniendo el máximo provecho de su existente ... algunas distribuciones de Linux no optimizan el acceso al disco fuera de la caja (hdparm)), organizar los datos en la memoria (por ejemplo mediante la copia en un disco RAM) antes de tiempo, o estar dispuesto a esperar.


Si usted no está obligado IO, usted podría estar perdiendo una gran cantidad de tiempo a copiar. Usted podría beneficiarse de los llamados métodos de copia cero. Algo así como Mapa de memoria del archivo y sólo acceder a ella a través de punteros.

Esto es un poco más allá de mi experiencia, por lo que debe leer un poco o esperar a que ayuda más conocimientos.

BTW-- Usted podría estar recibiendo en más trabajo que el problema de la pena; tal vez una máquina más rápida resolvería todos sus problemas ...

NB-- No es claro que se puede asignar memoria de la entrada estándar o bien ...

Mira en fread (). Se lee mucho más rápido para mí, sobre todo si búfer para fread se establece en 65536. Contras: que tiene que hacer mucho trabajo y esencialmente escribir su propia función getline convertir de lectura binaria de texto. Salida: archivo de E / S

Si el sistema operativo lo admite, puede intentar la lectura de archivos asíncrona, es decir, el archivo se lee en la memoria mientras que la CPU está ocupada haciendo otra cosa. Por lo tanto, el código es algo como:

start asynchronous read
loop:
  wait for asynchronous read to complete
  if end of file goto exit
  start asynchronous read
  do stuff with data read from file
  goto loop
exit:

Si usted tiene más de una CPU a continuación, una CPU lee el archivo y analiza los datos en las líneas, la otra CPU toma cada línea y la procesa.

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