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 饭桶
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"
wrote: On Thu, Jul 3, 2014 at 4:10 PM, 饭桶
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@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users