Es un tema que creo que es bastante tecnico, mas que preguntar sobre un trozo de codigo, o un algoritmo o algo del estilo, estoy buscando informacion sobre un aspecto del comportamiento de varios lenguajes de programacion, me explico:
Estoy haciendo una comparativa de lenguajes de programacion (en concreto PHP, Lua, Tcl y Ruby) en linea de comandos. Lo que quiero comparar es la eficiencia con operaciones de entrada/salida, asi que lo que he hecho es repetir el mismo codigo lo mas parecido posible en los 4 lenguajes, el codigo es algo asi:
Código:
Es basicamente una copia de un fichero, pero byte a byte.origen=open(argv[1]); destino=open(argv[2]); while (!eof(origen)) { c=read(origen,1); write(destino,c); } close(origen); close(destino);
Pues bien, el codigo en cada lenguaje funciona de maravillas, pero me di cuenta de que en algunos lenguajes tardaba poquisimo y en otros una barbaridad en comparacion. Utilizando herramientas para capturar las llamadas al sistema (strace), vi que las lecturas o escrituras de 1 byte, se transformaban en llamadas al sistema de 1 o 2 bloques (cosa que me parece bastante logica ¿es por buffering no?).
Pero lo que me llamo la atencion es que en un mismo lenguaje no se comportan igual el read y el write. Esta es la comparativa que he sacado, para lecturas/escrituras de 1 byte, los bytes que se leen/escriben realmente en las llamadas al SO:
Lenguaje | Tamaño lecturas (bytes) | Tamaño escrituras (bytes)
Tcl : 4096 | 4096
Lua : 1 | 1/4096
PHP : 8192 | 1
Ruby : 1 | 8192
Me ha resultado muy extraño por ejemplo el caso de PHP, que al leer un byte realmente lee 8K (bien, eso quiere decir que mejora el rendimiento), pero a la hora de escribir escribe 1.
Luego por ejemplo el caso de Lua, que alterna escrituras de 1 byte con escrituras de 4K, ya me parece increible.
Despues de toda esta biblia, mi pregunta es: ¿Sabeis por que se pueden estar comportando de esta forma los lenguajes? ¿Hay alguna razon para que un lenguaje haga buffering en lecturas y no en escrituras o viceversa?
Muchas gracias.