Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/12/2009, 11:41
Stanix
 
Fecha de Ingreso: diciembre-2009
Mensajes: 2
Antigüedad: 14 años, 5 meses
Puntos: 0
Comportamientos extraños en operaciones E/S con varios lenguajes

Hola, este es mi primer mensaje en este foro, asi que no seais muy duros conmigo pls :P

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:
origen=open(argv[1]);
destino=open(argv[2]);
while (!eof(origen))
{
	c=read(origen,1);
	write(destino,c);
}
close(origen);
close(destino);
Es basicamente una copia de un fichero, pero byte a byte.
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.