Added benchmarks over mounting an unformatted disk
These locally show the expected O(d(n)) growth of the block_size search when block_count is known. A rough estimate of runtime for a 1 GiB device with a 90 MiB/s read bandwidth (using the mt25q for rough numbers): known bs/bc => ~1.44 us known block_size => ~1.44 us known block_count => ~125 us unknown bs/bc => ~376 ms
This commit is contained in:
+3
-1
@@ -220,7 +220,9 @@ int lfs_emubd_read(const struct lfs_config *cfg, lfs_block_t block,
|
|||||||
lfs_emubd_t *bd = cfg->context;
|
lfs_emubd_t *bd = cfg->context;
|
||||||
|
|
||||||
// check if read is valid
|
// check if read is valid
|
||||||
LFS_ASSERT(block < bd->cfg->erase_count);
|
if (block >= bd->cfg->erase_count) {
|
||||||
|
return LFS_ERR_INVAL;
|
||||||
|
}
|
||||||
LFS_ASSERT(off % bd->cfg->read_size == 0);
|
LFS_ASSERT(off % bd->cfg->read_size == 0);
|
||||||
LFS_ASSERT(size % bd->cfg->read_size == 0);
|
LFS_ASSERT(size % bd->cfg->read_size == 0);
|
||||||
LFS_ASSERT(off+size <= bd->cfg->erase_size);
|
LFS_ASSERT(off+size <= bd->cfg->erase_size);
|
||||||
|
|||||||
+3
-1
@@ -70,7 +70,9 @@ int lfs_filebd_read(const struct lfs_config *cfg, lfs_block_t block,
|
|||||||
lfs_filebd_t *bd = cfg->context;
|
lfs_filebd_t *bd = cfg->context;
|
||||||
|
|
||||||
// check if read is valid
|
// check if read is valid
|
||||||
LFS_ASSERT(block < bd->cfg->erase_count);
|
if (block >= bd->cfg->erase_count) {
|
||||||
|
return LFS_ERR_INVAL;
|
||||||
|
}
|
||||||
LFS_ASSERT(off % bd->cfg->read_size == 0);
|
LFS_ASSERT(off % bd->cfg->read_size == 0);
|
||||||
LFS_ASSERT(size % bd->cfg->read_size == 0);
|
LFS_ASSERT(size % bd->cfg->read_size == 0);
|
||||||
LFS_ASSERT(off+size <= bd->cfg->erase_size);
|
LFS_ASSERT(off+size <= bd->cfg->erase_size);
|
||||||
|
|||||||
+3
-1
@@ -60,7 +60,9 @@ int lfs_rambd_read(const struct lfs_config *cfg, lfs_block_t block,
|
|||||||
lfs_rambd_t *bd = cfg->context;
|
lfs_rambd_t *bd = cfg->context;
|
||||||
|
|
||||||
// check if read is valid
|
// check if read is valid
|
||||||
LFS_ASSERT(block < bd->cfg->erase_count);
|
if (block >= bd->cfg->erase_count) {
|
||||||
|
return LFS_ERR_INVAL;
|
||||||
|
}
|
||||||
LFS_ASSERT(off % bd->cfg->read_size == 0);
|
LFS_ASSERT(off % bd->cfg->read_size == 0);
|
||||||
LFS_ASSERT(size % bd->cfg->read_size == 0);
|
LFS_ASSERT(size % bd->cfg->read_size == 0);
|
||||||
LFS_ASSERT(off+size <= bd->cfg->erase_size);
|
LFS_ASSERT(off+size <= bd->cfg->erase_size);
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
[cases.bench_superblocks_found]
|
[cases.bench_superblocks_format]
|
||||||
|
code = '''
|
||||||
|
lfs_t lfs;
|
||||||
|
|
||||||
|
BENCH_START();
|
||||||
|
lfs_format(&lfs, cfg) => 0;
|
||||||
|
BENCH_STOP();
|
||||||
|
'''
|
||||||
|
|
||||||
|
[cases.bench_superblocks_mount]
|
||||||
|
defines.KNOWN_BLOCK_SIZE = [true, false]
|
||||||
|
defines.KNOWN_BLOCK_COUNT = [true, false]
|
||||||
# support benchmarking with files
|
# support benchmarking with files
|
||||||
defines.N = [0, 1024]
|
defines.N = [0, 1024]
|
||||||
defines.FILE_SIZE = 8
|
defines.FILE_SIZE = 8
|
||||||
@@ -28,6 +39,18 @@ code = '''
|
|||||||
}
|
}
|
||||||
lfs_unmount(&lfs) => 0;
|
lfs_unmount(&lfs) => 0;
|
||||||
|
|
||||||
|
if (KNOWN_BLOCK_SIZE) {
|
||||||
|
cfg->block_size = BLOCK_SIZE;
|
||||||
|
} else {
|
||||||
|
cfg->block_size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (KNOWN_BLOCK_COUNT) {
|
||||||
|
cfg->block_count = BLOCK_COUNT;
|
||||||
|
} else {
|
||||||
|
cfg->block_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
BENCH_START();
|
BENCH_START();
|
||||||
lfs_mount(&lfs, cfg) => 0;
|
lfs_mount(&lfs, cfg) => 0;
|
||||||
BENCH_STOP();
|
BENCH_STOP();
|
||||||
@@ -35,22 +58,27 @@ code = '''
|
|||||||
lfs_unmount(&lfs) => 0;
|
lfs_unmount(&lfs) => 0;
|
||||||
'''
|
'''
|
||||||
|
|
||||||
[cases.bench_superblocks_missing]
|
[cases.bench_superblocks_mount_missing]
|
||||||
|
defines.KNOWN_BLOCK_SIZE = [true, false]
|
||||||
|
defines.KNOWN_BLOCK_COUNT = [true, false]
|
||||||
code = '''
|
code = '''
|
||||||
lfs_t lfs;
|
lfs_t lfs;
|
||||||
|
|
||||||
|
if (KNOWN_BLOCK_SIZE) {
|
||||||
|
cfg->block_size = BLOCK_SIZE;
|
||||||
|
} else {
|
||||||
|
cfg->block_size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (KNOWN_BLOCK_COUNT) {
|
||||||
|
cfg->block_count = BLOCK_COUNT;
|
||||||
|
} else {
|
||||||
|
cfg->block_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
BENCH_START();
|
BENCH_START();
|
||||||
int err = lfs_mount(&lfs, cfg);
|
int err = lfs_mount(&lfs, cfg);
|
||||||
assert(err != 0);
|
assert(err != 0);
|
||||||
BENCH_STOP();
|
BENCH_STOP();
|
||||||
'''
|
'''
|
||||||
|
|
||||||
[cases.bench_superblocks_format]
|
|
||||||
code = '''
|
|
||||||
lfs_t lfs;
|
|
||||||
|
|
||||||
BENCH_START();
|
|
||||||
lfs_format(&lfs, cfg) => 0;
|
|
||||||
BENCH_STOP();
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user