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

git-svn-id: file:///Users/frsyuki/project/msgpack-git/svn/x@61 5a5092ae-2292-43ba-b2d5-dcab9c1a2731
This commit is contained in:
frsyuki
2009-02-15 09:09:57 +00:00
parent a721837ed0
commit 4d13f614b6
4 changed files with 86 additions and 73 deletions

View File

@@ -25,7 +25,7 @@
#include <stdexcept>
#ifndef MSGPACK_ZONE_CHUNK_SIZE
#define MSGPACK_ZONE_CHUNK_SIZE 8*1024
#define MSGPACK_ZONE_CHUNK_SIZE 1024
#endif
namespace msgpack {
@@ -44,19 +44,19 @@ public:
void push_finalizer(void (*func)(void* obj, void* user), T* obj, void* user);
public:
object_nil* nnil() { return new (alloc()) object_nil(); }
object_true* ntrue() { return new (alloc()) object_true(); }
object_false* nfalse() { return new (alloc()) object_false(); }
object_u8* nu8( uint8_t v) { return new (alloc()) object_u8(v); }
object_u16* nu16(uint16_t v) { return new (alloc()) object_u16(v); }
object_u32* nu32(uint32_t v) { return new (alloc()) object_u32(v); }
object_u64* nu64(uint64_t v) { return new (alloc()) object_u64(v); }
object_i8* ni8( int8_t v) { return new (alloc()) object_i8(v); }
object_i16* ni16( int16_t v) { return new (alloc()) object_i16(v); }
object_i32* ni32( int32_t v) { return new (alloc()) object_i32(v); }
object_i64* ni64( int64_t v) { return new (alloc()) object_i64(v); }
object_float* nfloat( float v) { return new (alloc()) object_float(v); }
object_double* ndouble( double v) { return new (alloc()) object_double(v); }
object_nil* nnil () { return new (alloc()) object_nil(); }
object_true* ntrue () { return new (alloc()) object_true(); }
object_false* nfalse () { return new (alloc()) object_false(); }
object_u8* nu8 (uint8_t v) { return new (alloc()) object_u8(v); }
object_u16* nu16 (uint16_t v) { return new (alloc()) object_u16(v); }
object_u32* nu32 (uint32_t v) { return new (alloc()) object_u32(v); }
object_u64* nu64 (uint64_t v) { return new (alloc()) object_u64(v); }
object_i8* ni8 (int8_t v) { return new (alloc()) object_i8(v); }
object_i16* ni16 (int16_t v) { return new (alloc()) object_i16(v); }
object_i32* ni32 (int32_t v) { return new (alloc()) object_i32(v); }
object_i64* ni64 (int64_t v) { return new (alloc()) object_i64(v); }
object_float* nfloat (float v) { return new (alloc()) object_float(v); }
object_double* ndouble(double v) { return new (alloc()) object_double(v); }
object_raw_ref* nraw_ref(void* ptr, uint32_t len)
{ return new (alloc()) object_raw_ref(ptr, len); }
@@ -149,7 +149,7 @@ private:
user_finalizer_t m_user_finalizer;
private:
void resize_pool(size_t n);
void expand_chunk();
public:
static void finalize_free(void* obj, void* user)
@@ -173,6 +173,16 @@ inline bool zone::empty() const
return m_used == 0 && m_user_finalizer.empty();
}
inline void* zone::alloc()
{
if(m_pool.size() <= m_used/ZONE_CHUNK_SIZE) {
expand_chunk();
}
void* data = m_pool[m_used/ZONE_CHUNK_SIZE][m_used%ZONE_CHUNK_SIZE].data;
++m_used;
return data;
}
} // namespace msgpack