diff options
author | Christopher Haster <chaster@utexas.edu> | 2017-12-27 21:30:01 +0300 |
---|---|---|
committer | Christopher Haster <chaster@utexas.edu> | 2018-01-12 21:07:45 +0300 |
commit | 1fb6a195206db4927e19fc27372553957da3d515 (patch) | |
tree | 49a96d00f3f2f0df33ea037bea1525d5a08dbc62 /lfs.c | |
parent | db8872781a7bc110b2a84b67c5fe818e9708e68a (diff) |
Reduced ctz traverse runtime by 2x
Unfortunately for us, the ctz skip-list does not offer very much benefit
for full traversals. Since the information about which blocks are in
use are spread throughout the file, we can't use the fast-lanes
embedded in the skip-list without missing blocks.
However, it turns out we can at least use the 2nd level of the skip-list
without missing any blocks. From an asymptotic analysis, a constant speed
up isn't interesting, but from a pragmatic perspective, a 2x speedup is
not bad.
Diffstat (limited to 'lfs.c')
-rw-r--r-- | lfs.c | 14 |
1 files changed, 12 insertions, 2 deletions
@@ -1195,12 +1195,22 @@ static int lfs_ctz_traverse(lfs_t *lfs, return 0; } - err = lfs_cache_read(lfs, rcache, pcache, head, 0, &head, 4); + lfs_block_t heads[2]; + int count = 2 - (index & 1); + err = lfs_cache_read(lfs, rcache, pcache, head, 0, &heads, count*4); if (err) { return err; } - index -= 1; + for (int i = 0; i < count-1; i++) { + err = cb(data, heads[i]); + if (err) { + return err; + } + } + + head = heads[count-1]; + index -= count; } } |