summaryrefslogtreecommitdiffhomepage
path: root/miscutils
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-12-26 20:30:47 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-12-26 20:30:47 +0100
commitab9a98602f9a0c37f9382a57e421fe4e058d4a67 (patch)
tree21fcaef7ec4246480bd6712bf66507ec96e089ae /miscutils
parentf706a18f33a5e6360cd7567c6c5fc9714be3ed39 (diff)
bc: simple speedups
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@googlemail.com>
Diffstat (limited to 'miscutils')
-rw-r--r--miscutils/bc.c29
1 files changed, 28 insertions, 1 deletions
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;