Date: Sat, 22 Apr 2006 08:33:01 -0700 From: Don Dugger <dugger@hotlz.com> To: freebsd-chat@freebsd.org Cc: Dan Strick <strick@covad.net> Subject: Re: Why is not more FreeBSD software written in C++? Message-ID: <444A4CAD.7080901@hotlz.com> In-Reply-To: <200604221511.k3MFBxa2003218@mist.nodomain> References: <200604221511.k3MFBxa2003218@mist.nodomain>
next in thread | previous in thread | raw e-mail | index | archive | help
Not that it matters a great deal but I didn't write that. Don ;^) Dan Strick wrote: >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 "freebsd-chat-unsubscribe@freebsd.org" > >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?444A4CAD.7080901>