
lcaminiti wrote:
lcaminiti wrote:
benchmark numbers. I will run correct tests more along the lines of what you suggested.
Hello all,
I am looking into why Boost.Local has a long run-time and I run into something strange that I cannot explain... I am still looking into this but I wanted to ask if anyone has some insight.
Consider the following code which uses Boost.ScopeExit type deduction and a local functor class (these are bits that Boost.Local uses internally):
#include <boost/local/function.hpp> #include #include #include
int main() { double sum = 0.0; int factor = 10;
typedef void (*tag)(int factor); typedef BOOST_TYPEOF(boost::scope_exit::aux::wrap( boost::scope_exit::aux::deref(factor, (tag)0))) wrapped_t; typedef wrapped_t::type capture_t; struct params_t { typedef capture_t param_t; boost::scope_exit::aux::member<param_t, tag> param; } params = { { boost::scope_exit::aux::deref(factor, (tag)0) } };
// ******* std::cout << params.param.value << std::endl; // (1) std::vector v(1000000); // (2) // *******
class local_add { public: explicit local_add(double& _sum, int _factor): sum_(_sum), factor_(_factor) { } void operator()(double num) { return body(factor_, sum_, num); } private: double& sum_; int factor_;
void body(const int factor, double& sum, double num) const { sum += factor * num; } } add(sum, factor);
std::fill(v.begin(), v.end(), 10); for (size_t i = 0; i < 10000; ++i) { for (size_t j = 0; j < v.size(); ++j) { add(v[j]); } }
std::cout << sum << std::endl; return 0; }
This compiles and runs as:
$ time g++ -O3 -Wall -Wextra -I../../.. l09.cpp -ol09
real 0m5.969s user 0m0.994s sys 0m1.435s
$ time ./l09 10 1e+12
real 0m16.297s user 0m15.827s sys 0m0.109s
But if I simply swap lines (1) and (2):
$ diff -u l09.cpp l08.cpp --- l09.cpp 2011-03-29 12:21:16.034974600 -0400 +++ l08.cpp 2011-03-29 12:21:08.160478600 -0400 @@ -20,8 +20,8 @@ };
- std::cout << params.param.value << std::endl; std::vector v(1000000); + std::cout << params.param.value << std::endl;
class local_add {
Then it runs _much_ slower:
$ time g++ -O3 -Wall -Wextra -I../../.. l08.cpp -ol08
real 0m5.875s user 0m0.821s sys 0m1.231s
$ time ./l08 10 1e+12
real 0m44.469s user 0m43.874s sys 0m0.015s
Why swapping lines (1) and (2) changes the run-time? I don't understand it at all... I must be missing something...
Thank you in advance.
-- Lorenzo
http://boost.2283326.n4.nabble.com/file/n3415414/l08.exe?by-user=t l08.exe http://boost.2283326.n4.nabble.com/file/n3415414/l09.exe?by-user=t l09.exe
I attached the wrongs files. Here's the source: http://boost.2283326.n4.nabble.com/file/n3415420/l09.cpp l09.cpp http://boost.2283326.n4.nabble.com/file/n3415420/l08.cpp l08.cpp -- Lorenzo -- View this message in context: http://boost.2283326.n4.nabble.com/local-Help-for-the-Alternatives-section-t... Sent from the Boost - Dev mailing list archive at Nabble.com.