From e5b7a215e8c111cb759a69448f9c63f8c844aad0 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 11 May 2010 12:13:37 +0200 Subject: [PATCH] hand written code to turn a long long into a string -> very big speed win --- redis.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/redis.c b/redis.c index 39da76474..1ab854cae 100644 --- a/redis.c +++ b/redis.c @@ -2897,7 +2897,19 @@ static robj *createStringObjectFromLongLong(long long value) { o->encoding = REDIS_ENCODING_INT; o->ptr = (void*)((long)value); } else { - o->ptr = sdscatprintf(sdsempty(),"%lld",value); + char buf[32], *p; + char *c = "0123456789"; + unsigned long v; + + v = (value < 0) ? -value : value; + p = buf+31; /* point to the last character */ + while(v) { + *p-- = c[v%10]; + v /= 10; + } + if (value < 0) *p-- = '-'; + p++; + o = createObject(REDIS_STRING,sdsnewlen(p,32-(p-buf+1))); } } return o; @@ -3794,7 +3806,7 @@ static robj *rdbLoadIntegerObject(FILE *fp, int enctype) { val = 0; /* anti-warning */ redisPanic("Unknown RDB integer encoding type"); } - return createObject(REDIS_STRING,sdscatprintf(sdsempty(),"%lld",val)); + return createStringObjectFromLongLong(val); } static robj *rdbLoadLzfStringObject(FILE*fp) { -- GitLab