Boost logo

Boost Users :

Subject: Re: [Boost-users] boost::function performance issues with C++11
From: Angelo Mondaini (oangelo_at_[hidden])
Date: 2014-07-03 21:38:51


Maybe trying another compiler would help you obtain your "proof".
How about intel compiler?
It also has the "-std=c++11" flag, so, if it is a compiler issue it will be
clear.

2014-07-03 22:22 GMT-03:00 饭桶 <athrun911500_at_[hidden]>:

> Thanks, that helps. But still there are only about 7 times slower.
> Specifically, the performance difference only happens when passing a
> vector as parameter. I tried passing reference and shared pointer, they are
> kind of similar to boost::function.
>
> So here is my guess according to your suggestion. Maybe std::function uses
> copying code that can be easier optimized. But that's just my guess, still
> need proof.
>
> -Athrun
>
>
> At 2014-07-04 08:50:00, "Angelo Mondaini" <oangelo_at_[hidden]> wrote:
>
> I guess that with -std=c++11 the compiler may not do all the possible
> optimizations, since c++11 is "new".
> How about go wild and use -O3 as compilation flag?
> This will give more freedom to the compiler optimization, and maybe more
> velocity.
>
>
> 2014-07-03 21:23 GMT-03:00 饭桶 <athrun911500_at_[hidden]>:
>
>> Hi Michael,
>>
>> Thanks for your suggestion. I understand that using a reference or a
>> pointer will achieve better performance, and I really appreciate you
>> pointed out that for me.
>> But I intend to do this to highlight my point, that *the performance are
>> quite different with or without -std=c++11*. And I'm really curious
>> about that.
>>
>> Consider a situiation, that I'm using boost::function. However, the
>> performance could be seriously affected by using a compiling flag
>> (-std=c++11). That will be very weired to me, unless someone can tell me
>> what happens there.
>>
>> BTW, when I say default, I mean release mode.
>> Thanks
>> Xuepeng
>>
>>
>>
>>
>>
>>
>> At 2014-07-04 07:55:39, "Michael Powell" <mwpowellhtx_at_[hidden]> wrote:
>> >On Thu, Jul 3, 2014 at 4:10 PM, 饭桶 <athrun911500_at_[hidden]> wrote:
>> >> Hi,
>> >>
>> >> Does anyone know why -std=c++11 causes so much difference on
>> >> boost::function?
>> >>
>> >> I was planed to understand if there any performance issues with big size of
>> >> parameters.
>> >> So I wrote a function that takes a vector as parameter, like func2 shows. I
>> >> know it's better to use a pointer or reference as function parameter. I just
>> >> want to evaluate the performance, so let's keep the vector as parameter.
>> >>
>> >> However, I found that it's quite slow when compiled with -std=c++11. In
>> >> detail, it takes 173874 milliseconds with C++11, while it takes 3676 seconds
>> >> without C++11.
>> >>
>> >> About 50 times slower!! How can that be?
>> >>
>> >> In my opinion, I thought boost::function should had the same performance
>> >> with std::function. So I decided to try std::function in C++11 directly,
>> >> Finally, it takes about 29233 milliseconds. That's till 8 times slows!
>> >>
>> >> Can anyone tell me what happend here?
>> >
>> >I don't know the inner workings of either boost::function or
>> >std::function. It's not boost's fault per se, but there are a couple
>> >of things you could do differently.
>> >
>> >> int func2(std::vector<int> i){
>> >> total += i.size();
>> >> return i.size();
>> >> }
>> >
>> >Pass a reference or even a pointer instead of the whole vector. You
>> >are copying the vector every time.
>> >
>> >> const int T = 1000000;
>> >> s = boost::chrono::system_clock::now();
>> >> for (int i = 0; i < T; ++i)
>> >> call(boost::bind(&func2, v));
>> >> e = boost::chrono::system_clock::now();
>> >
>> >You are also binding func2 every time; not sure if that's getting
>> >optimized or not.
>> >
>> >You likely want to bind with a placeholder instead of the vector
>> >itself, then call the binding itself. i.e.
>> >
>> >auto binding = boost::bind(&func2, _1);
>> >binding(v);
>> >
>> >I do that frequently enough; and with more event-driven systems,
>> >boost::signals, etc, it is unavoidable. You want the placeholder
>> >instead, once-bound/later-called.
>> >
>> >> In case you need to know my enviorment, my OS is Arch, compiler is gcc
>> >> 4.9.0, and optimizations are default.
>> >
>> >Default can mean a lot of things. Debug or release mode? Beyond those
>> >two broad categories, do verify your settings and build for release
>> >mode.
>> >
>> >HTH
>> >
>> >> The execution time (ms) of three versions I tried:
>> >> boost::function with C++11 : 173874
>> >> boost::function without C++11 : 3676
>> >> std::function in C++11 : 29233
>> >>
>> >> Any thoughts are appreciated!
>> >> Thanks,
>> >> Athrun
>> >>
>> >>
>> >>
>> >> _______________________________________________
>> >> Boost-users mailing list
>> >> Boost-users_at_[hidden]
>> >> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>> >_______________________________________________
>> >Boost-users mailing list
>> >Boost-users_at_[hidden]
>> >http://lists.boost.org/mailman/listinfo.cgi/boost-users
>>
>>
>>
>>
>> _______________________________________________
>> Boost-users mailing list
>> Boost-users_at_[hidden]
>> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>>
>
>
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>



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