He hecho esta función en C usando llamadas al sistema (abrir, leer y escribir) para simular la función "cat" en sistemas Linux y es más lenta que la real ...¿Por qué mi función "cat" con llamadas al sistema es más lenta en comparación con "cat" de Linux?
Estoy usando el mismo el tamaño del buffer como el "gato" real y el uso de "strace" creo que está haciendo la misma cantidad de llamadas al sistema. Pero la salida de mi "gato" es un poco más lenta que el "gato" real.
Este es el código que tengo:
#define BUFSIZ 32768
int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
ssize_t writtenBytes = 0;
while(writtenBytes < readBytes) {
writtenBytes += write(fdout,
buffer + writtenBytes, readBytes - writtenBytes);
if(writtenBytes == -1) {
return -1;
}
}
return 0;
}
int catPrint(int fdin, int fdout) {
char buffer[BUFSIZ];
ssize_t readBytes;
do {
readBytes = read(fdin, buffer, BUFSIZ);
if(readBytes == -1) {
return -1;
}
if(sysWriteBuffer(fdout, buffer, readBytes) == -1) {
return -1;
}
} while(readBytes > 0);
return 0;
}
estoy leyendo desde un archivo (que me pase como argumento al principal, creo que el código no es necesario aquí) lo que yo llamo el catPrint() funcionar con ese descriptor de archivo y 1 para el descriptor de salida para que se imprima en stdout.
No entiendo por qué es más lento porque estoy usando el mismo archivo para probar y con ambos (el verdadero "gato" y el mío) solo hay una lectura() y una escritura() para todo el texto. ¿No debería el texto completo solo aparecer en la pantalla?
P.S: He etiquetado esto como tarea aunque mi pregunta aquí (por qué es más lenta) no es parte de la tarea. Solo necesitaba usar las llamadas al sistema para crear una función de tipo "cat", que está hecha. Solo estoy intrigado por mi código que es un poco más lento.
problema resuelto con la estupidez de mí
acabo decidió llamar gato original del linux unas cuantas veces en el mismo archivo, uno tras otro, y sólo se dio cuenta de que también era lento algunas de las veces que me lo llamé, tan lento como el mío. Supongo que todo está bien que ...
Perdón por perder el tiempo como esta gente.
En mi humilde opinión, la etiqueta 'homework' es engañosa. Su pregunta se refiere a un hecho de fondo interesante. 'tarea' implica trabajo tedioso de principiantes o (en el otro extremo de la escala) una pregunta de prueba. –
BTW el manejo del error (es decir, escritura que retorna -1) es incorrecto si el error ocurre en la segunda escritura(). – jpalecek
Puedes borrar la etiqueta de tarea si crees que es mejor ... ¿Qué quieres decir con jpalecek? Solo hay una escritura (como en la llamada al sistema) Solo tengo una función auxiliar. Si el write() dentro de esa función auxiliar falla, necesito devolver el -1 hasta donde se llamaba catPrint() ... –