Date: Sat, 22 Apr 2006 08:11:59 -0700 (PDT) From: Dan Strick <strick@covad.net> To: freebsd-chat@freebsd.org Cc: dan@mist.nodomain Subject: Re: Why is not more FreeBSD software written in C++? Message-ID: <200604221511.k3MFBxa2003218@mist.nodomain>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200604221511.k3MFBxa2003218>
