Share Pastebin
Guest
Public paste!

evilsocket

By: a guest | Mar 19th, 2010 | Syntax: C++ | Size: 4.08 KB | Hits: 42 | Expires: Never
Copy text to clipboard
  1. #include <iostream>
  2. #include <vector>
  3. #include <stdio.h>
  4. #include <sys/time.h>
  5.  
  6. using namespace std;
  7.  
  8. #define MPOOL_DEFAULT_ITEMS 6000
  9.  
  10. // #define DEBUG 1
  11.  
  12. #ifdef DEBUG
  13. #   define DBG printf
  14. #else
  15. #   define DBG //
  16. #endif
  17.  
  18. #define ADDRESS_OF(o) reinterpret_cast<unsigned long>(o)
  19.  
  20. template< typename object_t >
  21. class MemPool {
  22. private :
  23.  
  24.     struct pool_item {
  25.         unsigned  free : 1;
  26.         object_t *object;
  27.  
  28.         pool_item (){
  29.             free   = 1;
  30.             object = new object_t;
  31.         }
  32.     };
  33.  
  34.     vector<pool_item *> m_pool;
  35.  
  36. public  :
  37.  
  38.     MemPool( unsigned int items = MPOOL_DEFAULT_ITEMS );
  39.     ~MemPool();
  40.  
  41.     object_t *alloc();
  42.     void      free( object_t *o );
  43.     void      free( int index );
  44.  
  45.     inline unsigned long size(){
  46.         return m_pool.size() * (sizeof(pool_item) + sizeof(object_t));
  47.     }
  48. };
  49.  
  50. template< typename object_t > MemPool<object_t>::MemPool( unsigned int items /*= MPOOL_DEFAULT_ITEMS*/ ){
  51.     unsigned int i;
  52.     DBG( "* Pre alloco %d oggetti ... \n", items );
  53.     for( i = 0; i < items; i++ ){
  54.         m_pool.push_back( new pool_item );
  55.     }
  56.     DBG( "* fatto .\n" );
  57. }
  58.  
  59. template< typename object_t > MemPool<object_t>::~MemPool(){
  60.     unsigned int i;
  61.     pool_item *item = NULL;
  62.  
  63.     DBG( "* De alloco tutto ... \n" );
  64.     for( i = 0; i < m_pool.size(); i++ ){
  65.         item = m_pool[i];
  66.         delete item->object;
  67.         delete item;
  68.     }
  69.     m_pool.clear();
  70.     DBG( "* fatto .\n" );
  71. }
  72.  
  73. template< typename object_t > object_t * MemPool<object_t>::alloc(){
  74.     unsigned int i, size = m_pool.size();
  75.     pool_item *item = NULL;
  76.  
  77.     DBG( "* Cerco un elemento libero ... " );
  78.     /* find first free item */
  79.     for( i = 0; i < size; i++ ){
  80.         item = m_pool[i];
  81.         if( item->free == 1 ){
  82.             DBG( "trovato a %p .\n", item->object );
  83.             item->free = 0;
  84.             return item->object;
  85.         }
  86.     }
  87.  
  88.     /* no free item found, expand pool */
  89.     DBG( "non trovato, espando il pool .\n" );
  90.     item = new pool_item;
  91.     m_pool.push_back(item);
  92.  
  93.     return item->object;
  94. }
  95.  
  96. template< typename object_t > void MemPool<object_t>::free( object_t *o ){
  97.     unsigned long o_address = ADDRESS_OF(o);
  98.     unsigned int i, size = m_pool.size();
  99.     pool_item *item = NULL;
  100.  
  101.     DBG( "* Libero %p ... ", o );
  102.     /* check object ownership */
  103.     for( i = 0; i < size; i++ ){
  104.         item = m_pool[i];
  105.         if( ADDRESS_OF(item->object) == o_address ){
  106.             DBG( "trovato, libero .\n" );
  107.             if( m_pool.size() > MPOOL_DEFAULT_ITEMS ){
  108.                 delete item->object;
  109.                 delete item;
  110.                 m_pool.erase( m_pool.begin() + i );
  111.             }
  112.             else{
  113.                 item->free = 1;
  114.             }
  115.             return;
  116.         }
  117.     }
  118.  
  119.     DBG( "non trovato, chiamo l'operatore delete .\n" );
  120.  
  121.     delete o;
  122. }
  123.  
  124. template< typename object_t > void MemPool<object_t>::free( int index ){
  125.     pool_item *item = NULL;
  126.  
  127.     DBG( "* Libero %d ... \n", index );
  128.  
  129.     item = m_pool[index];
  130.  
  131.     if( m_pool.size() > MPOOL_DEFAULT_ITEMS ){
  132.         m_pool.erase( m_pool.begin() + index );
  133.         delete item->object;
  134.         delete item;
  135.     }
  136.     else{
  137.         item->free = 1;
  138.     }
  139. }
  140.  
  141. class Object {
  142.     public:
  143.  
  144.         Object(){
  145.             DBG( "\t* Oggetto creato .\n" );
  146.         }
  147.  
  148.         ~Object(){
  149.             DBG( "\t* Oggetto distrutto .\n" );
  150.         }
  151. };
  152.  
  153. long ticks(){
  154.     timeval ts;
  155.     gettimeofday(&ts,0);
  156.     return ts.tv_sec * 1000 + (ts.tv_usec / 1000);
  157. }
  158.  
  159. int main()
  160. {
  161.     MemPool<Object> pool(10);
  162.     Object *o;
  163.     vector<Object *> tmp;
  164.     long start, end;
  165.     int i;
  166.  
  167.     start = ticks();
  168.     for( i = 0; i < 4000; i++ ){
  169.         tmp.push_back( pool.alloc() );
  170.     }
  171.     end = ticks();
  172.     printf( "Pool : %d ms, %d bytes\n", end - start, pool.size() );
  173.  
  174.     start = ticks();
  175.     for( i = 0; i < 4000; i++ ){
  176.         o = new Object;
  177.     }
  178.     end = ticks();
  179.  
  180.     printf( "New  : %d ms, %d bytes\n", end - start, 400 * sizeof(Object) );
  181.  
  182.     return 0;
  183. }