Ah, según tu edición, el búfer de lectura anticipada te estaba mordiendo. No puede probar dos programas que leen archivos uno al lado del otro ejecutándolos una vez. El primero siempre será más lento ya que el archivo está en el disco, una vez que el archivo esté en la memoria, el segundo se ejecutará más rápido, debe crear nuevos datos para cada uno o ejecutar uno y luego ejecutar ambos para que ambos obtengan el beneficio del búfer de lectura anticipada.
¿Quizás compiló sin optimización (o sin una configuración de optimización tan alta)?
Además, su código llamará a sysWriteBuffer
una vez con readBytes
igual a cero, ¿quizás eso (parcialmente) lo explique?
También puede usar sysWriteBuffer en línea (ya sea a través de un conmutador de compilador o manualmente).
"en línea" significa copiar el cuerpo de una función en su sitio de llamada para eliminar la sobrecarga de llamar a una función. A veces, los compiladores hacen esto automáticamente (creo que -O3 habilita esta optimización en gcc). También puedes usar el inline
palabra clave en gcc para decirle al compilador que inserte una función. Si hace esto, su declaración se verá así:
static inline int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
....
Investigación mmap(2).
Descartará detalles sutiles de ftell/fread, pero se saltará una capa de direccionamiento indirecto si el rendimiento de lectura es realmente importante.