Changeset 18838 for lang/c/msgpack

Show
Ignore:
Timestamp:
09/04/08 15:52:19 (5 years ago)
Author:
frsyuki
Message:

lang/c/msgpack: optimize zone::alloc()

Location:
lang/c/msgpack/trunk/cpp
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • lang/c/msgpack/trunk/cpp/object.hpp

    r18782 r18838  
    7070struct object_class { 
    7171        virtual ~object_class() {} 
    72         virtual     bool   isnil() const { return false; } 
    73         virtual     bool   xbool() const { throw cast_error(); } 
    74         virtual  uint8_t     xu8() const { throw cast_error(); } 
    75         virtual uint16_t    xu16() const { throw cast_error(); } 
    76         virtual uint32_t    xu32() const { throw cast_error(); } 
    77         virtual uint64_t    xu64() const { throw cast_error(); } 
    78         virtual   int8_t     xi8() const { throw cast_error(); } 
    79         virtual  int16_t    xi16() const { throw cast_error(); } 
    80         virtual  int32_t    xi32() const { throw cast_error(); } 
    81         virtual  int64_t    xi64() const { throw cast_error(); } 
    82         virtual    float  xfloat() const { throw cast_error(); } 
    83         virtual   double xdouble() const { throw cast_error(); } 
    84         virtual      raw    xraw() { throw cast_error(); } 
    85         virtual   array&  xarray() { throw cast_error(); } 
    86         virtual     map&    xmap() { throw cast_error(); } 
    87         virtual    const_raw   xraw() const { throw cast_error(); } 
     72        virtual bool     isnil  () const { return false; } 
     73        virtual bool     xbool  () const { throw cast_error(); } 
     74        virtual uint8_t  xu8    () const { throw cast_error(); } 
     75        virtual uint16_t xu16   () const { throw cast_error(); } 
     76        virtual uint32_t xu32   () const { throw cast_error(); } 
     77        virtual uint64_t xu64   () const { throw cast_error(); } 
     78        virtual int8_t   xi8    () const { throw cast_error(); } 
     79        virtual int16_t  xi16   () const { throw cast_error(); } 
     80        virtual int32_t  xi32   () const { throw cast_error(); } 
     81        virtual int64_t  xi64   () const { throw cast_error(); } 
     82        virtual float    xfloat () const { throw cast_error(); } 
     83        virtual double  xdouble() const { throw cast_error(); } 
     84        virtual raw      xraw   () { throw cast_error(); } 
     85        virtual array&   xarray () { throw cast_error(); } 
     86        virtual map&     xmap   () { throw cast_error(); } 
     87        virtual const_raw    xraw  () const { throw cast_error(); } 
    8888        virtual const array& xarray() const { throw cast_error(); } 
    89         virtual const   map&   xmap() const { throw cast_error(); } 
     89        virtual const map&   xmap  () const { throw cast_error(); } 
    9090        virtual bool operator== (const object_class* x) const { return false; } 
    91         bool operator!= (const object_class* x) const { return !(this->operator==(x)); } 
    9291        virtual bool operator<  (const object_class* x) const { throw cast_error(); } 
    9392        virtual bool operator>  (const object_class* x) const { throw cast_error(); } 
     93        bool operator!= (const object_class* x) const { return !(this->operator==(x)); } 
    9494        virtual void pack(dynamic_packer& p) const = 0; 
    9595        operator     bool() const { return   xbool(); } // FIXME !isnil(); 
     
    127127        //object(object_class& v) : val(&v) {} 
    128128        ~object() {} 
    129             bool   isnil() const { return val->isnil();   } 
    130             bool   xbool() const { return val->xbool();   } 
    131          uint8_t     xu8() const { return val->xu8();     } 
    132         uint16_t    xu16() const { return val->xu16();    } 
    133         uint32_t    xu32() const { return val->xu32();    } 
    134         uint64_t    xu64() const { return val->xu64();    } 
    135           int8_t     xi8() const { return val->xi8();     } 
    136          int16_t    xi16() const { return val->xi16();    } 
    137          int32_t    xi32() const { return val->xi32();    } 
    138          int64_t    xi64() const { return val->xi64();    } 
    139            float  xfloat() const { return val->xfloat();  } 
    140           double xdouble() const { return val->xdouble(); } 
    141              raw    xraw() { return val->xraw();   } 
    142           array&  xarray() { return val->xarray(); } 
    143             map&    xmap() { return val->xmap();   } 
    144            const_raw   xraw() const { return const_cast<const object_class*>(val)->xraw();   } 
     129        bool     isnil  () const { return val->isnil();   } 
     130        bool     xbool  () const { return val->xbool();   } 
     131        uint8_t  xu8    () const { return val->xu8();     } 
     132        uint16_t xu16   () const { return val->xu16();    } 
     133        uint32_t xu32   () const { return val->xu32();    } 
     134        uint64_t xu64   () const { return val->xu64();    } 
     135        int8_t   xi8    () const { return val->xi8();     } 
     136        int16_t  xi16   () const { return val->xi16();    } 
     137        int32_t  xi32   () const { return val->xi32();    } 
     138        int64_t  xi64   () const { return val->xi64();    } 
     139        float    xfloat () const { return val->xfloat();  } 
     140        double  xdouble() const { return val->xdouble(); } 
     141        raw      xraw   () { return val->xraw();   } 
     142        array&   xarray () { return val->xarray(); } 
     143        map&     xmap   () { return val->xmap();   } 
     144        const_raw    xraw  () const { return const_cast<const object_class*>(val)->xraw();   } 
    145145        const array& xarray() const { return const_cast<const object_class*>(val)->xarray(); } 
    146         const   map&   xmap() const { return const_cast<const object_class*>(val)->xmap();   } 
     146        const map&   xmap  () const { return const_cast<const object_class*>(val)->xmap();   } 
    147147        bool operator== (object x) const { return val->operator== (x.val); } 
    148148        bool operator!= (object x) const { return val->operator!= (x.val); } 
     
    164164        operator array&() { return val->operator array&(); } 
    165165        operator   map&() { return val->operator map&();   } 
    166         operator    raw() const { return val->operator raw();    } 
    167         operator array&() const { return val->operator array&(); } 
    168         operator   map&() const { return val->operator map&();   } 
     166        operator    const_raw() const { return val->operator const_raw();    } 
     167        operator const array&() const { return val->operator const array&(); } 
     168        operator const   map&() const { return val->operator const map&();   } 
    169169        const object& inspect(std::ostream& s) const 
    170170                { val->inspect(s); return *this; } 
  • lang/c/msgpack/trunk/cpp/unpack.cpp

    r18782 r18838  
    2121 
    2222namespace msgpack { 
     23 
    2324 
    2425struct unpacker::context { 
     
    99100                while(next_size < len + m_used) { next_size *= 2; } 
    100101 
    101                 // FIXME realloc? 
    102                 void* tmp = malloc(next_size); 
     102                void* tmp = realloc(m_buffer, next_size); 
    103103                if(!tmp) { throw std::bad_alloc(); } 
    104                 memcpy(tmp, m_buffer, m_used); 
    105                 free(m_buffer); 
     104                m_buffer = tmp; 
     105                //void* tmp = malloc(next_size); 
     106                //if(!tmp) { throw std::bad_alloc(); } 
     107                //memcpy(tmp, m_buffer, m_used); 
     108                //free(m_buffer); 
    106109 
    107110                m_buffer = tmp; 
  • lang/c/msgpack/trunk/cpp/zone.cpp

    r18782 r18838  
    2121 
    2222 
    23 void* zone::alloc() 
     23// FIXME custom allocator? 
     24 
     25void zone::expand_chunk() 
    2426{ 
    25         if(m_pool.size()*ZONE_CHUNK_SIZE <= m_used) { 
    26                 cell_t* chunk = (cell_t*)malloc(sizeof(cell_t)*ZONE_CHUNK_SIZE); 
    27                 if(!chunk) { throw std::bad_alloc(); } 
    28                 try { 
    29                         m_pool.push_back(chunk); 
    30                 } catch (...) { 
    31                         free(chunk); 
    32                         throw; 
    33                 } 
     27        cell_t* chunk = (cell_t*)malloc(sizeof(cell_t)*ZONE_CHUNK_SIZE); 
     28        if(!chunk) { throw std::bad_alloc(); } 
     29        try { 
     30                m_pool.push_back(chunk); 
     31        } catch (...) { 
     32                free(chunk); 
     33                throw; 
    3434        } 
    35         void* data = m_pool[m_used/ZONE_CHUNK_SIZE][m_used%ZONE_CHUNK_SIZE].data; 
    36         ++m_used; 
    37         return data; 
    3835} 
    3936 
     
    4138{ 
    4239        if(!m_pool.empty()) { 
    43                 for(size_t b=0; b < m_used/ZONE_CHUNK_SIZE; ++b) { 
     40                size_t base_size = m_used / ZONE_CHUNK_SIZE; 
     41                size_t extend_size = m_used % ZONE_CHUNK_SIZE; 
     42                for(size_t b=0; b < base_size; ++b) { 
    4443                        cell_t* c(m_pool[b]); 
    4544                        for(size_t e=0; e < ZONE_CHUNK_SIZE; ++e) { 
     
    4847                } 
    4948                cell_t* c(m_pool.back()); 
    50                 for(size_t e=0; e < m_used%ZONE_CHUNK_SIZE; ++e) { 
     49                for(size_t e=0; e < extend_size; ++e) { 
    5150                        reinterpret_cast<object_class*>(c[e].data)->~object_class(); 
    5251                } 
     
    6160        m_used = 0; 
    6261 
    63         for(user_finalizer_t::reverse_iterator it(m_user_finalizer.rbegin()), it_end(m_user_finalizer.rend()); 
     62        for(user_finalizer_t::reverse_iterator it(m_user_finalizer.rbegin()), 
     63                                        it_end(m_user_finalizer.rend()); 
    6464                        it != it_end; 
    6565                        ++it) { 
  • lang/c/msgpack/trunk/cpp/zone.hpp.erb

    r18782 r18838  
    2626 
    2727#ifndef MSGPACK_ZONE_CHUNK_SIZE 
    28 #define MSGPACK_ZONE_CHUNK_SIZE 8*1024 
     28#define MSGPACK_ZONE_CHUNK_SIZE 1024 
    2929#endif 
    3030 
     
    4545 
    4646public: 
    47            object_nil*    nnil() { return new (alloc()) object_nil();   } 
    48           object_true*   ntrue() { return new (alloc()) object_true();  } 
    49          object_false*  nfalse() { return new (alloc()) object_false(); } 
    50             object_u8*     nu8( uint8_t v) { return new (alloc())     object_u8(v); } 
    51            object_u16*    nu16(uint16_t v) { return new (alloc())    object_u16(v); } 
    52            object_u32*    nu32(uint32_t v) { return new (alloc())    object_u32(v); } 
    53            object_u64*    nu64(uint64_t v) { return new (alloc())    object_u64(v); } 
    54             object_i8*     ni8(  int8_t v) { return new (alloc())     object_i8(v); } 
    55            object_i16*    ni16( int16_t v) { return new (alloc())    object_i16(v); } 
    56            object_i32*    ni32( int32_t v) { return new (alloc())    object_i32(v); } 
    57            object_i64*    ni64( int64_t v) { return new (alloc())    object_i64(v); } 
    58          object_float*  nfloat(   float v) { return new (alloc())  object_float(v); } 
    59         object_double* ndouble(  double v) { return new (alloc()) object_double(v); } 
     47        object_nil*    nnil   () { return new (alloc()) object_nil();   } 
     48        object_true*   ntrue  () { return new (alloc()) object_true();  } 
     49        object_false*  nfalse () { return new (alloc()) object_false(); } 
     50        object_u8*     nu8    (uint8_t  v) { return new (alloc()) object_u8(v);    } 
     51        object_u16*    nu16   (uint16_t v) { return new (alloc()) object_u16(v);    } 
     52        object_u32*    nu32   (uint32_t v) { return new (alloc()) object_u32(v);    } 
     53        object_u64*    nu64   (uint64_t v) { return new (alloc()) object_u64(v);    } 
     54        object_i8*     ni8    (int8_t   v) { return new (alloc()) object_i8(v);    } 
     55        object_i16*    ni16   (int16_t  v) { return new (alloc()) object_i16(v);    } 
     56        object_i32*    ni32   (int32_t  v) { return new (alloc()) object_i32(v);    } 
     57        object_i64*    ni64   (int64_t  v) { return new (alloc()) object_i64(v);    } 
     58        object_float*  nfloat (float    v) { return new (alloc()) object_float(v); } 
     59        object_double* ndouble(double  v) { return new (alloc()) object_double(v); } 
    6060 
    6161        object_raw_ref* nraw_ref(void* ptr, uint32_t len) 
     
    150150 
    151151private: 
    152         void resize_pool(size_t n); 
     152        void expand_chunk(); 
    153153 
    154154public: 
     
    174174} 
    175175 
     176inline void* zone::alloc() 
     177{ 
     178        if(m_pool.size() <= m_used/ZONE_CHUNK_SIZE) { 
     179                expand_chunk(); 
     180        } 
     181        void* data = m_pool[m_used/ZONE_CHUNK_SIZE][m_used%ZONE_CHUNK_SIZE].data; 
     182        ++m_used; 
     183        return data; 
     184} 
     185 
    176186 
    177187}  // namespace msgpack