Después de proporcionar el mismo programa que lee un archivo de entrada generado aleatoriamente y hace eco de la misma cadena que lee en una salida. La única diferencia es que, por un lado, proporciono los métodos de lectura y escritura de las llamadas de sistema de Linux, y por otro lado, estoy usando fread/fwrite.¿Por qué la función fwrite libc es más rápida que la función de escritura syscall?
Programando mi aplicación con una entrada de 10Mb de tamaño y haciéndola eco de/dev/null, y asegurándome de que el archivo no está en caché, he encontrado que libc's fwrite es más rápido en escala GRANDE al usar memorias muy pequeñas (1 byte en el caso).
Aquí está mi salida de tiempo, usando fwrite:
real 0m0.948s
user 0m0.780s
sys 0m0.012s
Y el uso de la llamada al sistema de escritura:
real 0m8.607s
user 0m0.972s
sys 0m7.624s
La única posibilidad que se me ocurre es que internamente libc ya está buffering mi entrada ... Desafortunadamente no pude encontrar tanta información en la web, así que tal vez los gurús aquí podrían ayudarme.
"internamente libc ya está almacenando mi entrada en el búfer". Esto es exactamente lo que está haciendo. Probablemente incluso pueda leer el código fuente de libc si lo desea y ver exactamente cómo lo está haciendo. – kquinn