From 5f10ea30f4a2a3fd32eed0844ab999c6068f7fba Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sat, 5 Nov 2016 17:52:06 +0100 Subject: [PATCH] OPTIM: http: improve parsing performance of long URIs Searching the trailing space in long URIs takes some time. This can happen especially on static files and some blogs. By skipping valid character ranges by 32-bit blocks, it's possible to increase the HTTP performance from 212k to 216k req/s on requests features a 100-character URI, which is an increase of 2%. This is done for architectures supporting unaligned accesses (x86_64, x86, armv7a). There's only a 32-bit version because URIs are rarely long and very often short, so it's more efficient to limit the systematic overhead than to try to optimize for the rarest requests. --- src/proto_http.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/proto_http.c b/src/proto_http.c index c9f38b1b12..36428b1640 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -1519,8 +1519,25 @@ const char *http_parse_reqline(struct http_msg *msg, case HTTP_MSG_RQURI: http_msg_rquri: +#if defined(__x86_64__) || \ + defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || \ + defined(__ARM_ARCH_7A__) + /* speedup: skip bytes not between 0x21 and 0x7e inclusive */ + while (ptr <= end - sizeof(int)) { + int x = *(int *)ptr - 0x21212121; + if (x & 0x80808080) + break; + + x -= 0x5e5e5e5e; + if (!(x & 0x80808080)) + break; + + ptr += sizeof(int); + } +#endif + http_msg_rquri2: if (likely((unsigned char)(*ptr - 33) <= 93)) /* 33 to 126 included */ - EAT_AND_JUMP_OR_RETURN(http_msg_rquri, HTTP_MSG_RQURI); + EAT_AND_JUMP_OR_RETURN(http_msg_rquri2, HTTP_MSG_RQURI); if (likely(HTTP_IS_SPHT(*ptr))) { msg->sl.rq.u_l = ptr - msg_start - msg->sl.rq.u; -- 2.39.5