¿Cómo, con ... el hecho de que printf llame a escritura, es esto posible? ¿Hay algo que me estoy perdiendo?
Sí, hay algo que te hace falta. printf
no necesariamente llama a write
cada vez. Por el contrario, printf
almacena su salida. Es decir, a menudo almacena su resultado en un búfer de memoria, solo llamando al write
cuando el búfer está lleno, o en algunas otras condiciones.
write
es una llamada bastante caro, mucho más caro que la copia de datos en el búfer printf
's, lo que reduce el número de llamadas write
proporciona una ganancia neta de rendimiento.
Si su stdout está dirigida a un dispositivo terminal, entonces printf
llama a cada vez que ve un \n
- en su caso, cada vez que se invoca. Si su stdout se dirige a un archivo (o al /dev/null
), las llamadas a printf
solo se escribirán cuando su búfer interno esté lleno.
Suponiendo que está redireccionando su salida, y que el búfer interno printf
es 4Kbytes, entonces el primer bucle invoca write
3000000/(4096/12) == 8780 veces. Sin embargo, su segundo ciclo invoca write
3000000 veces.
Más allá del efecto de un menor número de llamadas a write
, es el tamaño de las llamadas a write
. La cantidad de almacenamiento en un disco duro es un sector, a menudo 512 bytes. Escribir una cantidad menor de datos que un sector puede implicar leer los datos originales en el sector, modificarlos y volver a escribir el resultado. Invocar write
con un sector completo, sin embargo, puede ir más rápido ya que no tiene que leer en los datos originales. El tamaño del buffer printf
se elige para que sea un múltiplo del tamaño de sector típico. De esta forma, el sistema puede escribir de manera más eficiente los datos en el disco.
Espero que su primer bucle sea mucho más rápido que el segundo.
depende de su sistema – JMBise
printf hace el almacenamiento en búfer. –
¿De verdad? ¿Estás calculando la longitud de la cuerda cada vez y luego midiendo eso como parte de los tiempos? –