[git commit] bc: simple speedups
Denys Vlasenko
vda.linux at googlemail.com
Wed Dec 26 19:30:47 UTC 2018
commit: https://git.busybox.net/busybox/commit/?id=ab9a98602f9a0c37f9382a57e421fe4e058d4a67
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master
function old new delta
bc_parse_pushName 20 56 +36
bc_program_index 47 71 +24
bc_parse_pushIndex 52 58 +6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 66/0) Total: 66 bytes
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
miscutils/bc.c | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/miscutils/bc.c b/miscutils/bc.c
index 2569967d6..cf04e9ff1 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -3439,17 +3439,38 @@ static void bc_parse_push(char i)
static void bc_parse_pushName(char *name)
{
+#if 1
+ BcVec *code = &G.prs.func->code;
+ size_t pos = code->len;
+ size_t len = strlen(name) + 1;
+
+ bc_vec_expand(code, pos + len);
+ strcpy(code->v + pos, name);
+ code->len = pos + len;
+#else
+ // Smaller code, but way slow:
do {
bc_parse_push(*name);
} while (*name++);
+#endif
}
+// Indexes < 0xfc are encoded verbatim, else first byte is
+// 0xfc, 0xfd, 0xfe or 0xff, encoding "1..4 bytes",
+// followed by that many bytes, lsb first.
+// (The above describes 32-bit case).
+#define SMALL_INDEX_LIMIT (0x100 - sizeof(size_t))
+
static void bc_parse_pushIndex(size_t idx)
{
size_t mask;
unsigned amt;
dbg_lex("%s:%d pushing index %zd", __func__, __LINE__, idx);
+ if (idx < SMALL_INDEX_LIMIT) {
+ goto push_idx;
+ }
+
mask = ((size_t)0xff) << (sizeof(idx) * 8 - 8);
amt = sizeof(idx);
do {
@@ -3458,9 +3479,10 @@ static void bc_parse_pushIndex(size_t idx)
amt--;
} while (amt != 0);
- bc_parse_push(amt);
+ bc_parse_push(SMALL_INDEX_LIMIT + amt);
while (idx != 0) {
+ push_idx:
bc_parse_push((unsigned char)idx);
idx >>= 8;
}
@@ -5257,6 +5279,11 @@ static size_t bc_program_index(char *code, size_t *bgn)
size_t res;
amt = *bytes++;
+ if (amt < SMALL_INDEX_LIMIT) {
+ *bgn += 1;
+ return amt;
+ }
+ amt -= SMALL_INDEX_LIMIT;
*bgn += amt + 1;
amt *= 8;
More information about the busybox-cvs
mailing list