Boost logo

Boost :

Subject: Re: [boost] [parameter] Compile-time performance
From: Domagoj Saric (dsaritz_at_[hidden])
Date: 2011-02-26 11:37:03

"Dave Abrahams" <dave_at_[hidden]> wrote in message
> At Fri, 25 Feb 2011 13:58:48 +0100,
> Domagoj Saric wrote:
>> The most likely suspect is the usage of a forward-sequence for parameter
>> type storage (argument packs) from which you fetch passed parameters
>> using
>> key-based lookup with the value_type<> metafunction. In my code I use an
>> associative container (mpl::map) for the task which has a
>> 'natural'/'efficient' key-based lookup...
> Heh, I came up with the idea for the O(1) instantiation mpl::map
> mechanism and used the same basic mechanism for lookup in
> Boost.Parameter, so what you're saying is a bit surprising.

Well, the documentation
@ 3.1 ArgumentPack) says "Every ArgumentPack is also a valid MPL Forward
Sequence..." and by looking at the ParametersSpec::bind<> implementation it
did look to me like a list/'chained'-like structure...(although my knowledge
of MPL and PP internals might quite be insufficient enough to mistake a list
for a map...)...

>> To confirm this I minimally changed the Boost.Parameter-based version of
>> my
>> code only to use mpl::maps instead of Boost.Parameter ArgumentPacks and
>> built time fell to ~58 seconds...(true, this does not have all the
>> compile-time check for correct usage and concept validation that
>> ParameterSpecs and ArgumentPacks have but I'd expect this to have a much
>> smaller effect than key-based lookup on a forward sequence)...
> I think you should do some more measurement :-)

Why? / You think that I am wrong in my assumption that key-based lookup on a
'plain forward sequence' would trump type requirements validation?
I'm assuming this solely from my TMP experience, where most of compile-time
inefficiencies were caused by 'incorrect'/'unhappy' combination of lookup
type (key, index...) and container type (random, associative)...and
sometimes they were/are unsolvable (e.g. Fusion's lack of proper associative
containers ...)...

+ I used only a single type requirement (mpl::is_sequence<>) for one of the
parameters and did not notice an improvement/difference without it...If you
think that even the existence of the type requirement validating machinery
(within Boost.Parameter) has an effect comparable or even greater than
container lookup perhaps we could test with that code commented out (if you
could explain which parts to comment out I could do it when I catch the

>> Is there an inherent issue that forbids the use of an associative
>> container
>> for ArgumentPacks or can this be fixed?
> ArgumentPacks are associative.

As previously said, the documentation only says forward (not also
associative) sequence...

> In fact, though, Matt Calabrese proved
> that the basic strategy of MPL associative containers did not produce
> the expected speedups. See "Instantiations Must Go" at
> for more
> details.

Hm...I read the two PDFs with the video playing along side and noticed
nothing about MPL associative containers...only about how FTMPL failed to
produce expected speedups...

+ From my experience, MPL associative containers do produce a very
significant improvement for key-based lookup...

> I would, however, love to speed up Boost.Parameter so if you find the
> actual cause or a way to do it, I'm all ears!

If only it internally used MPL (and Fusion perhaps) instead of doing things
from scratch (e.g. template_keyword -> mpl::pair, argument pack -> mpl:map
...) I might have an easier time following its internal flow (in the short
pauses from 'real work' :)...

Well, the first step I guess would be to disable type requirement validation
and measure the difference...

ps. have you used SW's template profiler (with B.P.) ?

"What Huxley teaches is that in the age of advanced technology, spiritual
devastation is more likely to come from an enemy with a smiling face than
from one whose countenance exudes suspicion and hate."
Neil Postman 

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