Boost logo

Boost Users :

Subject: Re: [Boost-users] g++ compilation is slow with Boost's constructs
From: Ilya Murav'jov (muravev_at_[hidden])
Date: 2010-09-09 12:17:14


Jason Merrill пишет:
> > On 09/08/2010 07:40 AM, Ilya Murav'jov wrote:
>> >> Dave Abrahams пишет:
>>> >>> G++4.5 implements O(1) template lookup, which could have a
significant
>>> >>> effect for Boost users.
>> >>
>> >> Thanks for the info. I've built gcc-4.5.1 myself and got not very
>> >> comforting results: g++4.2 is still 'unbeaten', g++4.5 is 15% slower.
> >
> > Hmm, that's disappointing. I grabbed the source file you mentioned, but
> > it seems to depend on other headers from your project; if you send me a
> > preprocessed file I'll try to take a look at what's slowing it down
> > sometime soon.
> >
> > Jason
> >

After some experiments I've done a clear example. It shows that
boost::lambda::bind() invocation cost 0.1 sec. Here is the code:

//////////////////// begin ////////////////////////

#include <boost/lambda/bind.hpp> // boost::lambda::bind
#include <boost/function.hpp> // boost::function

typedef boost::function<void()> TestFunctor;

template<int value>
struct TestStruct
{
};

#define IMPL_DEF_(Idx, Type) void Impl ## Idx(Type) {} \
void TestImpl ## Idx() \
{ \
    TestFunctor fnr; \
    fnr = boost::lambda::bind(&Impl ## Idx, Type()); \
} \
/**/

#define IMPL_DEF(Idx) IMPL_DEF_(Idx, TestStruct<Idx>)

#define IMPL_DEF_10_(Idx) \
IMPL_DEF(Idx ## 0) \
IMPL_DEF(Idx ## 1) \
IMPL_DEF(Idx ## 2) \
IMPL_DEF(Idx ## 3) \
IMPL_DEF(Idx ## 4) \
IMPL_DEF(Idx ## 5) \
IMPL_DEF(Idx ## 6) \
IMPL_DEF(Idx ## 7) \
IMPL_DEF(Idx ## 8) \
IMPL_DEF(Idx ## 9) \
/**/

#define IMPL_DEF_10(Idx) IMPL_DEF_10_(Idx)

IMPL_DEF_10(__LINE__)
IMPL_DEF_10(__LINE__)
IMPL_DEF_10(__LINE__)
IMPL_DEF_10(__LINE__)
IMPL_DEF_10(__LINE__)
IMPL_DEF_10(__LINE__)
IMPL_DEF_10(__LINE__)
IMPL_DEF_10(__LINE__)
IMPL_DEF_10(__LINE__)
IMPL_DEF_10(__LINE__)

//////////////////// end ////////////////////////

It does 100 invocations of boost::lambda::bind() with various types.
Benchmarks with "-c -g -O0 -pipe", Boost 1.44:

G++ 4.2.4: 14.75 sec
G++ 4.5.1: 09.57 sec

P.S. It shows that g++4.5 is quicker, though. :) Later I try to do
examples with other constructs (BOOST_FOREACH, Boost.Range, B.Function)
to find out where g++4.2 is better.

P.S.S. I suggest to make comparison among varios compilers (i.e., clang,
msvc, icc) with this test. It is interesting to see the quickest (don't
forget to include your CPU).

Regards,
 Ilya


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net