Foros del Web » Programación para mayores de 30 ;) » Programación General »

Comportamientos extraños en operaciones E/S con varios lenguajes

Estas en el tema de Comportamientos extraños en operaciones E/S con varios lenguajes en el foro de Programación General en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 10/12/2009, 11:41
 
Fecha de Ingreso: diciembre-2009
Mensajes: 2
Antigüedad: 14 años, 4 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.
  #2 (permalink)  
Antiguo 11/12/2009, 02:28
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Comportamientos extraños en operaciones E/S con varios lenguajes

Es la manera mas ineficiente que existe leer/escribir byte a byte, calcula que el dispositivo solo puede leer/escribir un SECTOR (512 bytes normalmente), asi que el buffering ayuda a mejorar el rendimiento que normalmente deberia ser bajo. Escribir mas implica escribir lo que ya esta escrito o esperar a que tu programa escriba, no se puede predecir que vas a escribir, en cambio leer se puede hacer inmediatamente asumiendo que el programa terminara leyendo en el futuro proximo.

De cualquier manera los S.O.s modernos implementan caches, que se usan por defecto, con lo cual tu lectura/escritura puede no ser inmediatamente traducida en un acceso al dispositivo ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 11/12/2009, 09:55
 
Fecha de Ingreso: diciembre-2009
Mensajes: 2
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Comportamientos extraños en operaciones E/S con varios lenguajes

Gracias por tu respuesta.

Se que el codigo es bastante ineficiente (probablemente no existe peor forma de copiar un fichero). Pero no es importante en este caso, lo que quiero saber es por que los lenguajes se comportan de forma tan diferente, es decir, que aspectos te pueden llevar a decidir que tu lenguaje se comporte de forma diferente en las lecturas y escrituras cuando lo estas diseñando, y por que php y ruby, por ejemplo, funcionan al reves.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:38.