Boost logo

Boost :

Subject: Re: [boost] [xpressive] Performance Tuning?
From: OvermindDL1 (overminddl1_at_[hidden])
Date: 2009-07-28 03:16:59

On Mon, Jul 27, 2009 at 10:34 PM, OvermindDL1<overminddl1_at_[hidden]> wrote:
> On Mon, Jul 27, 2009 at 6:17 PM, OvermindDL1<overminddl1_at_[hidden]> wrote:
>> /* snip */
> I did a quick first test at work, just a quick compile, got some
> errors, and quite frankly I do not know how this compiled in gcc
> either.  First error is:
> 1>r:\programming_projects\spirit_price\price_parsing\main.cpp(545) :
> error C2373: '_input' : redefinition; different type modifiers
> 1>        r:\programming_projects\spirit_price\price_parsing\main.cpp(544)
> : see declaration of '_input'
> The relevant code is:
>   template <class T>
>   T
>   extract(char const * & _input, char const * _description,
>      std::string const & _input);
> Why do the first and last function params have the same name (_input)?
>  And which one is the real input?  Based upon line 566, I changed the
> last _input to _value and that error (and one other) is now gone.
> Hmm, actually the third error is gone too.  Now I am getting lots of
> Warnings (as errors since I by default have warnings treated as
> errors) about double to int64_t cast, both in  your normal code on
> line 730
> Also, I added a:
>   tests.reserve(450000);
> right before the load_tests call, that changed the load_tests time
> from like 10 seconds to about 2 seconds on my system.
> Also, why are you using time(0), that only has second accuracy?

The mailing list seems to be taking a very long while to send the
message, so here it is again, but the attachment in the main.cpp file
only, not the test_inputs.dat file (which, when zipped, is over
350kb). So get the test_inputs.dat from the link in the post prior to
mine, and use the main.cpp that is attached to this post. Here is the
message I sent as well, perhaps it will come through eventually:

Okay, I basically just copy/pasted my thread-safe version of my spirit
parser over and ran it, it returned bad parse with like 13/9 or
something like that. According to the documentation in the original
cpp file, only "1", "1 2/3", or "1.2" are valid, not "2/3", so I
changed it to support that and ran it again, it parsed successfully
with all numbers in your tests matching successfully. Here is what it
printed, using the horribly inaccurate time function:
Testing string-based parsing
Testing Xpressive-based parsing
Testing Spirit-based parsing
string parsing: 8s
xpressive parsing: 33s
spirit parsing: 6s

If you do not mind, I am going to add a millisecond accuracy testing
framework (test.hpp from the boost examples) to the file and change
all the nasty time calls to it for a more reliable reading. I backed
up the main.cpp with my spirit addition before I will edit it anyway.
I am not home yet, will add the timing functionality when I get home.
I will post my new results with the enhanced testing when I get home
and finish it (maybe an hour) as well as posting both the main.cpp and
the testing header. For now, I have attached my modified main.cpp
that includes the thread-safe spirit parser (I have not yet added the
other two, do you want me to even bother?), and it includes the single
line add in the main function "tests.reserve(150000);", which reserves
just enough memory for your test file, now the loading function takes
about half a second on my computer, instead of 9 seconds.

Anyone else want to try the attached file and report the results as
well as what platform and OS? I am on Windows XP using MSVC8 SP1.

P.S. I would be quite happy if anyone could get rid of that
freakishly long double->int64_t cast warning in the xpressive code, I
like clean builds. :)

Boost list run by bdawes at, gregod at, cpdaniel at, john at