Boost logo

Boost :

Subject: Re: [boost] [local] Help for the Alternatives section
From: lcaminiti (lorcaminiti_at_[hidden])
Date: 2011-03-29 12:41:11


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-tp3408469p3415420.html
Sent from the Boost - Dev mailing list archive at Nabble.com.

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk