I have written some C style routines that convert strings to doubles,
ints, etc. using the C++ string stream objects.  Each of the methods
use a locally constructed istringstream object which uses the >>
operator to make the conversions.  A typical method looks like:

double  ToDouble( const string & str)
{
    std::istringstream iss( str);
    double num;
    iss >> num;
    return num;
}

I have heard that the C routines (sprintf and sscanf) are faster that
the corresponding C++ objects.  I did a couple of test and found that:
*     sprintf and ostreamstring are about the same in performance
(within a couple of percents).
*     istringstream (ISS) takes about 82% longer than the sscanf
times.  I tried a couple of variations where I used the ISS clear and
str methods instead of the constructor, but that didn't change the
performance.  When I made the ISS object static, it took only 12%
longer than as sscanf.   The times for each test for 5 million
conversions were:
      ISS local                                 2.79 sec
      ISS static                                1.78 sec
      sscanf                                     1.52 sec

The following static ISS mods made a big difference in performance and
shortened the run by 35%.
double  ToDouble( const string & str)
{
    static std::istringstream iss;

    iss.clear();  iss.str( str);
    double num;
    iss >> num;
    return num;
}

For some reason, running the default ISS constructor takes up a lot of
time.  Why is this?  I have looked at some of the gnu g++ header
source files, but nothing obvious shows up.  Could this an issue with
the basic_stringbuf or basic_streambuf classes?

Any ideas on how to fix this?  I realize an converter object could be
created with an ISS object, but at this point I prefer the ease of use
of the C style methods.  I'm looking for ways to make the construction
of the ISS object much faster.

Is the solution with a different basic_streambuf class?
_______________________________________________
help-gplusplus mailing list
help-gplusplus@gnu.org
http://lists.gnu.org/mailman/listinfo/help-gplusplus

Reply via email to