Boost logo

Boost Users :

Subject: Re: [Boost-users] Why use 'functional composition' with boost::bind
From: Christopher Jefferson (chris_at_[hidden])
Date: 2010-08-05 06:40:42


On 3 Aug 2010, at 15:35, Wolfram Brenig wrote:

> Hi,
>
> as a casual/newbie boost-user I'm trying to come to
> grips with why/when nested functional composition with
> boost::bind might be of help - following Karlsson's
> book, in its fifth printing.

You are not comparing like with like in your example, the compiler is over optimising.

I tried comparing these functions:

void f1(vector<int>& v)
{
     for(int i=0;i<v.size();i++) {
        v[i] = (random()*M_PI)/RAND_MAX;
        double x = sin(v[i]); x = x*x;
        double y = cos(v[i]); y = y*y;
        v[i] = x + y;
     }
}

void f2(vector<int>& v)
{
     for(int i=0;i<v.size();i++) {
        v[i] = (random()*M_PI)/RAND_MAX;
        }
     for(int i=0;i<v.size();i++) {
        v[i] = sin(v[i])*sin(v[i])+cos(v[i])*cos(v[i]);
     }
}

void f3(vector<int>& v)
{
     generate(v.begin(),v.end(),
               bind(multiplies<double>(),
                    bind(&random),
                    M_PI/RAND_MAX));

     transform(v.begin(),v.end(),v.begin(),
                bind(plus<double>(),
                     bind(multiplies<double>(),bind(sin,_1),bind(sin,_1)),
                     bind(multiplies<double>(),bind(cos,_1),bind(cos,_1))
                     )
                );
}

In a seperate file, I compiled:

#include <vector>
using namespace std;

void f1(vector<int>& v);
void f2(vector<int>& v);
void f3(vector<int>& v);

int main(void)
{
        std::vector<int> v(10000);
        for(int i = 0; i < 10000; ++i)
                FUN(v);
}
        
Replacing FUN with f1,f2 and f3.

Using g++ 4.4 and -O3 there was no difference in performance between them. In eariler versions of g++, the first one was faster, as the compiler didn't figure out it could fuse the loops together.

One very useful g++ flag is "-fdump-tree-all". This will dump out a number of files which show you how g++ is optimising the code. The format isn't documented, but it is fairly readable. Using this flag, you will see that f1,f2 and f3 are all turned into the same code in a recent g++.

Chris


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