Boost logo

Boost Users :

Subject: Re: [Boost-users] large data sets and BOOST_FOREACH / boost:bind don'tmix ?
From: pete_at_[hidden]
Date: 2010-02-05 10:30:52


 I would hazard a guess that you are using MSVC with _SECURE_SCL left
as the default ON.
 Here are my results with _SECURE_SCL on:
 Time: BOOST_FOREACH(Fred& fred, vec) { fred.inc(); } 1.406
 Time: std::for_each(vec.begin(),vec.end(),boost::bind(&Fred::inc,_1)
); 0.515
 Time: for (std::vector::iterator i = vec.begin(); i < theEnd ; i++)
{ (*i).inc(); } 1.313
 Time:
std::for_each(vec.begin();vec.end(),std::mem_fun_ref(&Fred::inc))
0.516
 Time: for (size_t i = 0; i < theSize ; i++) { vec[i].inc(); } 0.391
 And with _SECURE_SCL off:
 Time: BOOST_FOREACH(Fred& fred, vec) { fred.inc(); } 0.36
 Time: std::for_each(vec.begin(),vec.end(),boost::bind(&Fred::inc,_1)
); 0.515
 Time: for (std::vector::iterator i = vec.begin(); i < theEnd ; i++)
{ (*i).inc(); } 0.344
 Time:
std::for_each(vec.begin();vec.end(),std::mem_fun_ref(&Fred::inc))
0.516
 Time: for (size_t i = 0; i < theSize ; i++) { vec[i].inc(); } 0.375
  BODY { font-family:Arial, Helvetica, sans-serif;font-size:12px; }So
you can see that going through a function pointer has an abstraction
penalty - but this is basically the same whether it be through bind or
std::mem_fun_ref (haven't checked but assume they compile to same
optimized code)
 Iterators are faster than indexes if _SECURE_SCL is off and slower
if it is on - no new news here. ForEach has a small penalty over
iterators, but is rare that this matters.
 Pete
 On Fri 05/02/10 15:13 , Avi Bahra wrote:
 In my application I have very large data sets, I was using
BOOST_FOREACH
 and boost bind. But I was surprised that performance wise they were
the worst ?
 Take the following test:
 class Fred {
 public:
     Fred(int i = 0) : i_(i) {}
     void inc() { i_++;}
 private:
     int i_;
 };
 BOOST_AUTO_TEST_CASE( test_loop )
 {
     size_t vecSize = 200000000;
     std::vector vec; vec.reserve(vecSize);
     for (size_t i = 0; i < vecSize ; i++) { vec.push_back(Fred(i));}
      boost::timer timer;
     BOOST_FOREACH(Fred& fred, vec) { fred.inc(); }
      cout



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