summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-12-26 21:15:47 +0000
committerDamien George <damien.p.george@gmail.com>2015-12-26 21:15:47 +0000
commitbbe8d51bd9ab0c848ee833000dcc93eb78bcbcad (patch)
treec2350172345a33f09a92c62ef830e3aafa871065 /py
parente5ce5e2a432c8b77c5fc1c4397a04c800e95e7ff (diff)
downloadmicropython-bbe8d51bd9ab0c848ee833000dcc93eb78bcbcad.tar.gz
micropython-bbe8d51bd9ab0c848ee833000dcc93eb78bcbcad.zip
py/map: Add fast-path for hashing of map index when it is a qstr.
Map indicies are most commonly a qstr, and adding a fast-path for hashing of a qstr increases overall performance of the runtime. On pyboard there is a 4% improvement in the pystone benchmark for a cost of 20 bytes of code size. It's about a 2% improvement on unix.
Diffstat (limited to 'py')
-rw-r--r--py/map.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/py/map.c b/py/map.c
index 087f320c2e..7900ee1dec 100644
--- a/py/map.c
+++ b/py/map.c
@@ -201,7 +201,14 @@ mp_map_elem_t *mp_map_lookup(mp_map_t *map, mp_obj_t index, mp_map_lookup_kind_t
}
}
- mp_uint_t hash = MP_OBJ_SMALL_INT_VALUE(mp_unary_op(MP_UNARY_OP_HASH, index));
+ // get hash of index, with fast path for common case of qstr
+ mp_uint_t hash;
+ if (MP_OBJ_IS_QSTR(index)) {
+ hash = qstr_hash(MP_OBJ_QSTR_VALUE(index));
+ } else {
+ hash = MP_OBJ_SMALL_INT_VALUE(mp_unary_op(MP_UNARY_OP_HASH, index));
+ }
+
mp_uint_t pos = hash % map->alloc;
mp_uint_t start_pos = pos;
mp_map_elem_t *avail_slot = NULL;