"Philippe A. Bouchard" <[EMAIL PROTECTED]> writes:

> "Peter Dimov" <[EMAIL PROTECTED]> wrote in message
> 000901c2c7dc$e76195e0$1d00a8c0@pdimov2">news:000901c2c7dc$e76195e0$1d00a8c0@pdimov2...
>> From: "Peter Dimov" <[EMAIL PROTECTED]>
>> >
>> > One easy way to estimate the impact of an optimized allocator is to
>> #define
>> > BOOST_SP_USE_STD_ALLOCATOR, to make shared_ptr use std::allocator. On
> SGI
>> > derived STLs, std::allocator is usually faster than plain new.
>>
>> I tried to do that myself but benchmark.cpp doesn't compile for me,
> there's
>> probably no timespec on Windows.
>
> I have defined BOOST_SP_USE_STD_ALLOCATOR in benchmark.cpp (gcc 2.95):
>
> Resources required by list< shifted_ptr<T> >(4000):
> Arena 0:
> system bytes     =     226820
> in use bytes     =     226052
> Total (incl. mmap):
> system bytes     =     226820
> in use bytes     =     226052
> max mmap regions =          0
> max mmap bytes   =          0
> list shifted_ptr<T> took        0.0002951000 seconds to construct.
> list shifted_ptr<T> took        7.1966276647 seconds to reconstruct 2000
> times.
> list shifted_ptr<T> took        5.0495961000 seconds to copy 2000 times.
> list shifted_ptr<T> took        4.0016951000 seconds to sort 4000 times.
> list shifted_ptr<T> took        0.1382300647 seconds to swap 500 times.
> list shifted_ptr<T> took        0.0003241000 seconds to destroy.
>
> Resources required by list< shared_ptr<T> >(4000):
> Arena 0:
> system bytes     =     325124
> in use bytes     =     321988
> Total (incl. mmap):
> system bytes     =     325124
> in use bytes     =     321988
> max mmap regions =          0
> max mmap bytes   =          0
> list shared_ptr<T> took 0.0004259000 seconds to construct.
> list shared_ptr<T> took 14.0157271000 seconds to reconstruct 2000 times.
> list shared_ptr<T> took 5.0331178000 seconds to copy 2000 times.
> list shared_ptr<T> took 4.0376376000 seconds to sort 4000 times.
> list shared_ptr<T> took 0.1449102647 seconds to swap 500 times.
> list shared_ptr<T> took 0.0004831000 seconds to destroy.

Would you indulge me and try the benchmark again with the enclosed
shared_count patch applied and #undef BOOST_SP_USE_STD_ALLOCATOR?  I
don't really know what's going on under the covers in the SGI
allocator; this is basically just the same hack I threw at the problem
years ago.

My patch doesn't pretend to work for a threaded implementation, so
only the no-threads test applies.

*** shared_count.hpp.~1.31.~	Sun Jan 19 10:14:15 2003
--- shared_count.hpp	Wed Jan 29 17:28:11 2003
***************
*** 37,45 ****
--- 37,104 ----
  # pragma warn -8027     // Functions containing try are not expanded inline
  #endif
  
+ # include <deque>
+ # include <boost/type_traits/type_with_alignment.hpp>
+ # include <boost/type_traits/alignment_of.hpp>
+ 
  namespace boost
  {
  
+   namespace aux_
+   {
+ // # include <iostream>
+ 
+ template <unsigned sz, unsigned align>
+ union freeblock
+ {
+     typename boost::type_with_alignment<align>::type aligner;
+     char bytes[sz];
+     freeblock *next;
+ };
+ 
+ template <unsigned sz, unsigned align>
+ struct allocator_impl
+ {
+     typedef freeblock<sz,align> block;
+     
+     static std::deque<block> store;
+     static block* free;
+     
+     static inline void* alloc()
+     {
+         block* x = free;
+         if (x)
+         {
+             free = x->next;
+             return x;
+         }
+         else
+         {
+             store.resize(store.size() + 1);
+             return &store.back();
+         }
+     }
+ 
+     static inline void dealloc(void* p_)
+     {
+         block* p = static_cast<block*>(p_);
+         p->next = free;
+         free = p;
+     }
+ };
+ 
+ 
+ template <unsigned sz, unsigned align>
+ std::deque<freeblock<sz,align> > allocator_impl<sz,align>::store;
+ 
+ template <unsigned sz, unsigned align>
+ freeblock<sz,align>* allocator_impl<sz,align>::free = 0;
+ 
+ template <class T>
+ struct quick_allocator : allocator_impl<sizeof(T), boost::alignment_of<T>::value>
+ {
+ };
+   }
  // Debug hooks
  
  #if defined(BOOST_ENABLE_SP_DEBUG_HOOKS)
***************
*** 272,277 ****
--- 331,346 ----
      void operator delete(void * p)
      {
          std::allocator<this_type>().deallocate(static_cast<this_type *>(p), 1);
+     }
+ #else 
+     void * operator new(std::size_t)
+     {
+         return aux_::quick_allocator<this_type>::alloc();
+     }
+ 
+     void operator delete(void * p)
+     {
+         aux_::quick_allocator<this_type>::dealloc(p);
      }
  
  #endif
-- 
                       David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to