From e2e663291dd1408cc9c5118d258a568470e32f8c Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Fri, 27 Jan 2017 00:40:47 +0300 Subject: [PATCH] py/objstr: Optimize string concatenation with empty string. In this, don't allocate copy, just return non-empty string. This helps with a standard pattern of buffering data in case of short reads: buf = b"" while ...: s = f.read(...) buf += s ... For a typical case when single read returns all data needed, there won't be extra allocation. This optimization helps uasyncio. --- py/objstr.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/py/objstr.c b/py/objstr.c index f082e95591..7478198e02 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -358,6 +358,13 @@ mp_obj_t mp_obj_str_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) { switch (op) { case MP_BINARY_OP_ADD: case MP_BINARY_OP_INPLACE_ADD: { + if (lhs_len == 0) { + return rhs_in; + } + if (rhs_len == 0) { + return lhs_in; + } + vstr_t vstr; vstr_init_len(&vstr, lhs_len + rhs_len); memcpy(vstr.buf, lhs_data, lhs_len);