Commit 7a20f096 authored by antirez's avatar antirez
Browse files

sdscatvprintf(): guess buflen using format length.

sdscatvprintf() uses a loop where it tries to output the formatted
string in a buffer of the initial length, if there was not enough room,
a buffer of doubled size is tried and so forth.

The initial guess for the buffer length was very poor, an hardcoded
"16". This caused the printf to be processed multiple times without a
good reason. Given that printf functions are already not fast, the
overhead was significant.

The new heuristic is to use a buffer 4 times the length of the format
buffer, and 32 as minimal size. This appears to be a good balance for
typical uses of the function inside the Redis code base.

This change improved INFO command performances 3 times.
parent 001775f5
...@@ -293,8 +293,9 @@ sds sdscpy(sds s, const char *t) { ...@@ -293,8 +293,9 @@ sds sdscpy(sds s, const char *t) {
sds sdscatvprintf(sds s, const char *fmt, va_list ap) { sds sdscatvprintf(sds s, const char *fmt, va_list ap) {
va_list cpy; va_list cpy;
char *buf, *t; char *buf, *t;
size_t buflen = 16; size_t buflen = strlen(fmt)*4;
if (buflen < 32) buflen = 32;
while(1) { while(1) {
buf = zmalloc(buflen); buf = zmalloc(buflen);
if (buf == NULL) return NULL; if (buf == NULL) return NULL;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment