Stream buffering issue

Posted by Kolyunya on Stack Overflow See other posts from Stack Overflow or by Kolyunya
Published on 2014-06-06T21:11:59Z Indexed on 2014/06/06 21:25 UTC
Read the original article Hit count: 127

Filed under:

The mod_rewrite documentation states that it is a strict requirement to disable in(out)put buffering in a rewrite program.

Keeping that in mind I've written a simple program (I do know that it lacks the EOF check but this is not an issue and it saves one condition check per loop):

#include <stdio.h>
#include <stdlib.h>
int main ( void )
{
    setvbuf(stdin,NULL,_IOLBF,4200);
    setvbuf(stdout,NULL,_IOLBF,4200);
    int character;
    while ( 42 )
    {
        character = getchar();
        if ( character == '-' )
        {
            character = '_';
        }
        putchar(character);
    }
    return 42 - 42;
}

After making some measurements I was shocked - it was over 9,000 times slower than the demo Perl script provided by the documentation:

#!/usr/bin/perl
    $| = 1; # Turn off I/O buffering
    while (<STDIN>) {
        s/-/_/g; # Replace dashes with underscores
        print $_;
    }

Now I have two related questions:

Question 1. I believe that the streams may be line buffered since Apache sends a new line after each path. Am I correct? Switching my program to

setvbuf(stdin,NULL,_IOLBF,4200);

setvbuf(stdout,NULL,_IOLBF,4200);

makes it twice as fast as Perl one. This should not hit Apache's performance, should it?

Question 2. How can one write a program in C which will use unbuffered streams (like Perl one) and will perform as fast as Perl one?

© Stack Overflow or respective owner

Related posts about c