diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2025-02-10 11:04:26 -0500 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2025-02-11 14:28:46 -0500 |
commit | 6e93417d275be9436b986f48b39b2dbacee730b4 (patch) | |
tree | 86d9d419deb3866c6e0133b87621182154b46726 | |
parent | 069b203617ca643b94122e41d34699c4f2ef949e (diff) | |
download | bfs-6e93417d275be9436b986f48b39b2dbacee730b4.tar.xz |
trie: Micro-optimize trie_representative()
popcount(map & (bit - 1) & mask) has a longer critical path than
popcount(map & (bit - 1)) & mask.
-rw-r--r-- | src/trie.c | 9 |
1 files changed, 5 insertions, 4 deletions
@@ -211,10 +211,11 @@ static struct trie_leaf *trie_representative(const struct trie *trie, const void if ((offset >> 1) < length) { unsigned char nibble = trie_key_nibble(key, length, offset); unsigned int bit = 1U << nibble; - // bits = bitmap & bit ? bitmap & (bit - 1) : 0 - unsigned int mask = -!!(node->bitmap & bit); - unsigned int bits = node->bitmap & (bit - 1) & mask; - index = count_ones(bits); + unsigned int map = node->bitmap; + unsigned int bits = map & (bit - 1); + unsigned int mask = -!!(map & bit); + // index = (map & bit) ? count_ones(bits) : 0; + index = count_ones(bits) & mask; } ptr = node->children[index]; } |