Generalized btree benchmarks, amortized benchmarks, plot.py/plotmpl.py tweaks
These benchmarks are now more useful for seeing how these B-trees perform. In plot.py/plotmpl.py: - Added --legend as another alias for -l, --legend-right. - Allowed omitting of datasets from the legend by using empty strings in --labels. - Do not sum multiple data points on the same x coordinate. This was a bad idea that risks invalid results going unnoticed. As a plus multiple data points on the same x coordinate can be abused for a cheap representation of measurement error.
This commit is contained in:
@@ -5,6 +5,11 @@ defines.LOOKAHEAD_SIZE = 'BLOCK_COUNT / 8'
|
||||
|
||||
[cases.bench_btree_lookup]
|
||||
defines.N = [8, 16, 32, 64, 128, 256, 1024]
|
||||
# 0 = in-order
|
||||
# 1 = reversed-order
|
||||
# 2 = random-order
|
||||
defines.ORDER = [0, 1, 2]
|
||||
defines.SEED = 42
|
||||
in = 'lfs.c'
|
||||
code = '''
|
||||
lfs_t lfs;
|
||||
@@ -17,17 +22,22 @@ code = '''
|
||||
lfs.free.i = 0;
|
||||
lfs_alloc_ack(&lfs);
|
||||
|
||||
uint32_t prng = SEED;
|
||||
|
||||
// create a tree with N elements
|
||||
lfsr_btree_t btree = LFSR_BTREE_NULL;
|
||||
const char *alphas = "abcdefghijklmnopqrstuvwxyz";
|
||||
for (lfs_size_t i = 0; i < N; i++) {
|
||||
lfsr_btree_push(&lfs, &btree, i, LFSR_TAG_INLINED, 1,
|
||||
lfs_off_t i_
|
||||
= (ORDER == 0) ? i
|
||||
: (ORDER == 1) ? 0
|
||||
: BENCH_PRNG(&prng) % (btree.weight+1);
|
||||
lfsr_btree_push(&lfs, &btree, i_, LFSR_TAG_INLINED, 1,
|
||||
&alphas[i % 26], 1) => 0;
|
||||
}
|
||||
|
||||
// bench lookup
|
||||
BENCH_START();
|
||||
uint32_t prng = 42;
|
||||
lfs_size_t i = BENCH_PRNG(&prng) % N;
|
||||
uint8_t buffer[4];
|
||||
lfsr_tag_t tag_;
|
||||
@@ -40,12 +50,17 @@ code = '''
|
||||
assert(tag_ == LFSR_TAG_INLINED);
|
||||
assert(id_ == i);
|
||||
assert(weight_ == 1);
|
||||
assert(memcmp(buffer, &alphas[i % 26], 1) == 0);
|
||||
BENCH_STOP();
|
||||
'''
|
||||
|
||||
[cases.bench_btree_append]
|
||||
[cases.bench_btree_commit]
|
||||
defines.N = [8, 16, 32, 64, 128, 256, 1024]
|
||||
# 0 = in-order
|
||||
# 1 = reversed-order
|
||||
# 2 = random-order
|
||||
defines.ORDER = [0, 1, 2]
|
||||
defines.SEED = 42
|
||||
defines.AMORTIZED = false
|
||||
in = 'lfs.c'
|
||||
code = '''
|
||||
lfs_t lfs;
|
||||
@@ -58,19 +73,28 @@ code = '''
|
||||
lfs.free.i = 0;
|
||||
lfs_alloc_ack(&lfs);
|
||||
|
||||
uint32_t prng = 42;
|
||||
uint32_t prng = SEED;
|
||||
|
||||
// create a tree with N elements
|
||||
if (AMORTIZED) {
|
||||
BENCH_START();
|
||||
}
|
||||
lfsr_btree_t btree = LFSR_BTREE_NULL;
|
||||
const char *alphas = "abcdefghijklmnopqrstuvwxyz";
|
||||
for (lfs_size_t i = 0; i < N; i++) {
|
||||
lfsr_btree_push(&lfs, &btree, i, LFSR_TAG_INLINED, 1,
|
||||
lfs_off_t i_
|
||||
= (ORDER == 0) ? i
|
||||
: (ORDER == 1) ? 0
|
||||
: BENCH_PRNG(&prng) % (btree.weight+1);
|
||||
lfsr_btree_push(&lfs, &btree, i_, LFSR_TAG_INLINED, 1,
|
||||
&alphas[i % 26], 1) => 0;
|
||||
}
|
||||
|
||||
// bench appending a new id
|
||||
BENCH_START();
|
||||
lfs_size_t i = N;
|
||||
if (!AMORTIZED) {
|
||||
BENCH_START();
|
||||
}
|
||||
lfs_size_t i = BENCH_PRNG(&prng) % N;
|
||||
lfsr_btree_push(&lfs, &btree, i, LFSR_TAG_INLINED, 1,
|
||||
&alphas[i % 26], 1) => 0;
|
||||
BENCH_STOP();
|
||||
@@ -86,5 +110,5 @@ code = '''
|
||||
assert(tag_ == LFSR_TAG_INLINED);
|
||||
assert(id_ == i);
|
||||
assert(weight_ == 1);
|
||||
assert(memcmp(buffer, &alphas[i % 26], 1) == 0);
|
||||
'''
|
||||
|
||||
|
||||
Reference in New Issue
Block a user