Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is my "cat" function with system calls slower compared to Linux's "cat"?

I've done this function in C using system calls (open, read and write) to simulate the "cat" function in Linux systems and it's slower than the real one...

I'm using the same buffer size as the real "cat" and using "strace" I think it's making the same amount of system calls. But the output from my "cat" is a little bit slower than the real "cat".

This is the code I have:

#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;
}

I'm reading from a file (that I pass as argument to main, I think that code is not needed here) than I call the catPrint() function with that file descriptor and 1 for the output descriptor so it prints to stdout.

I don't understand why it's slower because I'm using the same file for testing and with both (the real "cat" and mine) there's only one read() and one write() for the whole text. Shouldn't the whole text just appear on screen?

P.S: I've tagged this as homework although my question here (why it's slower) is not part of the homework. I only needed to use the system calls to create a "cat" type function, which is done. I'm just intrigued by my code that's a bit a slower.

PROBLEM SOLVED WITH STUPIDITY FROM ME:
I just decided to call linux's original cat a few times on the same file, one after the other, and I just realized that it was also slow some of the times I called it, just as slow as my own. I guess everything's fine than...

Sorry for wasting your time like this people.

like image 344
rfgamaral Avatar asked Apr 20 '09 18:04

rfgamaral


People also ask

Are cats faster than DD?

The data may be input or output to and from any of these; but there are important differences concerning the output when going to a partition. Also, during the transfer, the data can be modified using the conv options to suit the medium. (For this purpose, however, dd is slower than cat.)


1 Answers

Ah, based on your edit you were being bitten by the readahead buffer. You cannot test two programs that read files side by side by running them once. The first always be slower since the file is on disk, once the file is in memory the second will run faster, you must either create new data for each or run one and then run both so they both get the benefit of the readahead buffer.

like image 80
Chas. Owens Avatar answered Nov 15 '22 21:11

Chas. Owens