mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 08:08:53 -05:00
Optimize deferred replies to use shared objects instead of sprintf (#10334)
Avoid sprintf/ll2string on setDeferredAggregateLen()/addReplyLongLongWithPrefix() when we can used shared objects. In some pipelined workloads this achieves about 10% improvement. Co-authored-by: Oran Agra <oran@redislabs.com>
This commit is contained in:
parent
a7179e7570
commit
b857928ba7
@ -714,6 +714,24 @@ void setDeferredAggregateLen(client *c, void *node, long length, char prefix) {
|
|||||||
* we return NULL in addReplyDeferredLen() */
|
* we return NULL in addReplyDeferredLen() */
|
||||||
if (node == NULL) return;
|
if (node == NULL) return;
|
||||||
|
|
||||||
|
/* Things like *2\r\n, %3\r\n or ~4\r\n are emitted very often by the protocol
|
||||||
|
* so we have a few shared objects to use if the integer is small
|
||||||
|
* like it is most of the times. */
|
||||||
|
const size_t hdr_len = OBJ_SHARED_HDR_STRLEN(length);
|
||||||
|
const int opt_hdr = length < OBJ_SHARED_BULKHDR_LEN;
|
||||||
|
if (prefix == '*' && opt_hdr) {
|
||||||
|
setDeferredReply(c, node, shared.mbulkhdr[length]->ptr, hdr_len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (prefix == '%' && opt_hdr) {
|
||||||
|
setDeferredReply(c, node, shared.maphdr[length]->ptr, hdr_len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (prefix == '~' && opt_hdr) {
|
||||||
|
setDeferredReply(c, node, shared.sethdr[length]->ptr, hdr_len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
char lenstr[128];
|
char lenstr[128];
|
||||||
size_t lenstr_len = sprintf(lenstr, "%c%ld\r\n", prefix, length);
|
size_t lenstr_len = sprintf(lenstr, "%c%ld\r\n", prefix, length);
|
||||||
setDeferredReply(c, node, lenstr, lenstr_len);
|
setDeferredReply(c, node, lenstr, lenstr_len);
|
||||||
@ -806,12 +824,19 @@ void addReplyLongLongWithPrefix(client *c, long long ll, char prefix) {
|
|||||||
/* Things like $3\r\n or *2\r\n are emitted very often by the protocol
|
/* Things like $3\r\n or *2\r\n are emitted very often by the protocol
|
||||||
* so we have a few shared objects to use if the integer is small
|
* so we have a few shared objects to use if the integer is small
|
||||||
* like it is most of the times. */
|
* like it is most of the times. */
|
||||||
if (prefix == '*' && ll < OBJ_SHARED_BULKHDR_LEN && ll >= 0) {
|
const int opt_hdr = ll < OBJ_SHARED_BULKHDR_LEN && ll >= 0;
|
||||||
|
if (prefix == '*' && opt_hdr) {
|
||||||
addReply(c,shared.mbulkhdr[ll]);
|
addReply(c,shared.mbulkhdr[ll]);
|
||||||
return;
|
return;
|
||||||
} else if (prefix == '$' && ll < OBJ_SHARED_BULKHDR_LEN && ll >= 0) {
|
} else if (prefix == '$' && opt_hdr) {
|
||||||
addReply(c,shared.bulkhdr[ll]);
|
addReply(c,shared.bulkhdr[ll]);
|
||||||
return;
|
return;
|
||||||
|
} else if (prefix == '%' && opt_hdr) {
|
||||||
|
addReply(c,shared.maphdr[ll]);
|
||||||
|
return;
|
||||||
|
} else if (prefix == '~' && opt_hdr) {
|
||||||
|
addReply(c,shared.sethdr[ll]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf[0] = prefix;
|
buf[0] = prefix;
|
||||||
|
@ -1790,6 +1790,10 @@ void createSharedObjects(void) {
|
|||||||
sdscatprintf(sdsempty(),"*%d\r\n",j));
|
sdscatprintf(sdsempty(),"*%d\r\n",j));
|
||||||
shared.bulkhdr[j] = createObject(OBJ_STRING,
|
shared.bulkhdr[j] = createObject(OBJ_STRING,
|
||||||
sdscatprintf(sdsempty(),"$%d\r\n",j));
|
sdscatprintf(sdsempty(),"$%d\r\n",j));
|
||||||
|
shared.maphdr[j] = createObject(OBJ_STRING,
|
||||||
|
sdscatprintf(sdsempty(),"%%%d\r\n",j));
|
||||||
|
shared.sethdr[j] = createObject(OBJ_STRING,
|
||||||
|
sdscatprintf(sdsempty(),"~%d\r\n",j));
|
||||||
}
|
}
|
||||||
/* The following two shared objects, minstring and maxstring, are not
|
/* The following two shared objects, minstring and maxstring, are not
|
||||||
* actually used for their value but as a special object meaning
|
* actually used for their value but as a special object meaning
|
||||||
|
@ -109,6 +109,7 @@ typedef long long ustime_t; /* microsecond time type. */
|
|||||||
#define PROTO_SHARED_SELECT_CMDS 10
|
#define PROTO_SHARED_SELECT_CMDS 10
|
||||||
#define OBJ_SHARED_INTEGERS 10000
|
#define OBJ_SHARED_INTEGERS 10000
|
||||||
#define OBJ_SHARED_BULKHDR_LEN 32
|
#define OBJ_SHARED_BULKHDR_LEN 32
|
||||||
|
#define OBJ_SHARED_HDR_STRLEN(_len_) (((_len_) < 10) ? 4 : 5) /* see shared.mbulkhdr etc. */
|
||||||
#define LOG_MAX_LEN 1024 /* Default maximum length of syslog messages.*/
|
#define LOG_MAX_LEN 1024 /* Default maximum length of syslog messages.*/
|
||||||
#define AOF_REWRITE_ITEMS_PER_CMD 64
|
#define AOF_REWRITE_ITEMS_PER_CMD 64
|
||||||
#define AOF_ANNOTATION_LINE_MAX_LEN 1024
|
#define AOF_ANNOTATION_LINE_MAX_LEN 1024
|
||||||
@ -1229,7 +1230,9 @@ struct sharedObjectsStruct {
|
|||||||
*select[PROTO_SHARED_SELECT_CMDS],
|
*select[PROTO_SHARED_SELECT_CMDS],
|
||||||
*integers[OBJ_SHARED_INTEGERS],
|
*integers[OBJ_SHARED_INTEGERS],
|
||||||
*mbulkhdr[OBJ_SHARED_BULKHDR_LEN], /* "*<value>\r\n" */
|
*mbulkhdr[OBJ_SHARED_BULKHDR_LEN], /* "*<value>\r\n" */
|
||||||
*bulkhdr[OBJ_SHARED_BULKHDR_LEN]; /* "$<value>\r\n" */
|
*bulkhdr[OBJ_SHARED_BULKHDR_LEN], /* "$<value>\r\n" */
|
||||||
|
*maphdr[OBJ_SHARED_BULKHDR_LEN], /* "%<value>\r\n" */
|
||||||
|
*sethdr[OBJ_SHARED_BULKHDR_LEN]; /* "~<value>\r\n" */
|
||||||
sds minstring, maxstring;
|
sds minstring, maxstring;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user