On Friday 21 Apr 2006 09:20, Don Dugger wrote:
>
> The example above is not exactly a realworld example. Even if you stick
> to  plain C, a repeated putchar(' ') is 1-2 orders of magnitude slower
> than aggregating those characters and write()'ing them every few dozen
> chars.
>

This might seem obvious, but is it really true?  I wrote a program that
tries it both ways with the output redirected to /dev/null and discovered
that filling a 24 character buffer and doing a write() takes about 11 times
as much cpu time as 24 putchar()s.  Perhaps a buffer larger than a "few
dozen chars" would be useful.  There must be a moral here somewhere.  :-)

Don continued:
>
> I'm not sure that I/O routine efficiency is really that relevant. I can't
> think of any program I use whose I/O routines are CPU bound. Ok, I guess
> if  we look at really weak or embedded devices, say, those Soekris
> net4501  boards, I/O CPU efficiency will make a difference.
>

I wrote in my original message that I first noticed the iostream performance
problem when I compared the run time of a C program rewritten in C++ to the
run time of the original C program.  The C++ version ran about 5.5 times
slower.  It was a very "real world" program that performed some simple matrix
computations and pretty-printed the results.  Most of the effort apparently
went into the pretty-printing.  This must have exaggerated the performance
problem.

The C program did a lot of stuff like:

        char buf[...];
        sprintf (buf, "...", ...);      /* format output */
        do_something_with (buf);

The equivalent iostream idiom is:

        ostringstream bos;
        bos.str ("");
        bos << ... ;                    // format output
        string s = bos.str();           // extract string from ostringstream
        do_something_with (s.c_str());  // extract characters from string

This turns out to be a performance nightmare for various reasons
apparently involving the implementation of strings and iostreams.
The problem is not just with ostringstreams.

        printf ("...", ...);

generally runs many times faster than

        cout << ... << ...;

The problem is not just with formatted output.  

        putchar (c);

also runs many times faster than

        cout.put (c);

I don't know why.  It just does.  Perhaps in-line functions are not
always an efficient alternative to preprocessor macros.

I am not claiming that strings and iostreams are bad.  I am observing
that some reasonable programs that use these facilities will run very
slowly and I am suggesting that it is not always obvious which programs
these are.  I am also expressing disappointment because I want the
decision to use any feature of C++ or its standard library to be a
no-brainer.

Dan Strick
_______________________________________________
freebsd-chat@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-chat
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to