bench_dir.toml 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. # deterministic prng
  2. code = '''
  3. static uint32_t xorshift32(uint32_t *state) {
  4. uint32_t x = *state;
  5. x ^= x << 13;
  6. x ^= x >> 17;
  7. x ^= x << 5;
  8. *state = x;
  9. return x;
  10. }
  11. '''
  12. [cases.bench_dir_open]
  13. # 0 = in-order
  14. # 1 = reversed-order
  15. # 2 = random-order
  16. defines.ORDER = [0, 1, 2]
  17. defines.N = 1024
  18. defines.FILE_SIZE = 8
  19. defines.CHUNK_SIZE = 8
  20. code = '''
  21. lfs_t lfs;
  22. lfs_format(&lfs, cfg) => 0;
  23. lfs_mount(&lfs, cfg) => 0;
  24. // first create the files
  25. char name[256];
  26. uint8_t buffer[CHUNK_SIZE];
  27. for (lfs_size_t i = 0; i < N; i++) {
  28. sprintf(name, "file%08x", i);
  29. lfs_file_t file;
  30. lfs_file_open(&lfs, &file, name,
  31. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  32. uint32_t file_prng = i;
  33. for (lfs_size_t j = 0; j < FILE_SIZE; j += CHUNK_SIZE) {
  34. for (lfs_size_t k = 0; k < CHUNK_SIZE; k++) {
  35. buffer[k] = xorshift32(&file_prng);
  36. }
  37. lfs_file_write(&lfs, &file, buffer, CHUNK_SIZE) => CHUNK_SIZE;
  38. }
  39. lfs_file_close(&lfs, &file) => 0;
  40. }
  41. // then read the files
  42. BENCH_START();
  43. uint32_t prng = 42;
  44. for (lfs_size_t i = 0; i < N; i++) {
  45. lfs_off_t i_
  46. = (ORDER == 0) ? i
  47. : (ORDER == 1) ? (N-1-i)
  48. : xorshift32(&prng) % N;
  49. sprintf(name, "file%08x", i_);
  50. lfs_file_t file;
  51. lfs_file_open(&lfs, &file, name, LFS_O_RDONLY) => 0;
  52. uint32_t file_prng = i_;
  53. for (lfs_size_t j = 0; j < FILE_SIZE; j += CHUNK_SIZE) {
  54. lfs_file_read(&lfs, &file, buffer, CHUNK_SIZE) => CHUNK_SIZE;
  55. for (lfs_size_t k = 0; k < CHUNK_SIZE; k++) {
  56. assert(buffer[k] == xorshift32(&file_prng));
  57. }
  58. }
  59. lfs_file_close(&lfs, &file) => 0;
  60. }
  61. BENCH_STOP();
  62. lfs_unmount(&lfs) => 0;
  63. '''
  64. [cases.bench_dir_creat]
  65. # 0 = in-order
  66. # 1 = reversed-order
  67. # 2 = random-order
  68. defines.ORDER = [0, 1, 2]
  69. defines.N = 1024
  70. defines.FILE_SIZE = 8
  71. defines.CHUNK_SIZE = 8
  72. code = '''
  73. lfs_t lfs;
  74. lfs_format(&lfs, cfg) => 0;
  75. lfs_mount(&lfs, cfg) => 0;
  76. BENCH_START();
  77. uint32_t prng = 42;
  78. char name[256];
  79. uint8_t buffer[CHUNK_SIZE];
  80. for (lfs_size_t i = 0; i < N; i++) {
  81. lfs_off_t i_
  82. = (ORDER == 0) ? i
  83. : (ORDER == 1) ? (N-1-i)
  84. : xorshift32(&prng) % N;
  85. sprintf(name, "file%08x", i_);
  86. lfs_file_t file;
  87. lfs_file_open(&lfs, &file, name,
  88. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0;
  89. uint32_t file_prng = i_;
  90. for (lfs_size_t j = 0; j < FILE_SIZE; j += CHUNK_SIZE) {
  91. for (lfs_size_t k = 0; k < CHUNK_SIZE; k++) {
  92. buffer[k] = xorshift32(&file_prng);
  93. }
  94. lfs_file_write(&lfs, &file, buffer, CHUNK_SIZE) => CHUNK_SIZE;
  95. }
  96. lfs_file_close(&lfs, &file) => 0;
  97. }
  98. BENCH_STOP();
  99. lfs_unmount(&lfs) => 0;
  100. '''
  101. [cases.bench_dir_remove]
  102. # 0 = in-order
  103. # 1 = reversed-order
  104. # 2 = random-order
  105. defines.ORDER = [0, 1, 2]
  106. defines.N = 1024
  107. defines.FILE_SIZE = 8
  108. defines.CHUNK_SIZE = 8
  109. code = '''
  110. lfs_t lfs;
  111. lfs_format(&lfs, cfg) => 0;
  112. lfs_mount(&lfs, cfg) => 0;
  113. // first create the files
  114. char name[256];
  115. uint8_t buffer[CHUNK_SIZE];
  116. for (lfs_size_t i = 0; i < N; i++) {
  117. sprintf(name, "file%08x", i);
  118. lfs_file_t file;
  119. lfs_file_open(&lfs, &file, name,
  120. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  121. uint32_t file_prng = i;
  122. for (lfs_size_t j = 0; j < FILE_SIZE; j += CHUNK_SIZE) {
  123. for (lfs_size_t k = 0; k < CHUNK_SIZE; k++) {
  124. buffer[k] = xorshift32(&file_prng);
  125. }
  126. lfs_file_write(&lfs, &file, buffer, CHUNK_SIZE) => CHUNK_SIZE;
  127. }
  128. lfs_file_close(&lfs, &file) => 0;
  129. }
  130. // then remove the files
  131. BENCH_START();
  132. uint32_t prng = 42;
  133. for (lfs_size_t i = 0; i < N; i++) {
  134. lfs_off_t i_
  135. = (ORDER == 0) ? i
  136. : (ORDER == 1) ? (N-1-i)
  137. : xorshift32(&prng) % N;
  138. sprintf(name, "file%08x", i_);
  139. int err = lfs_remove(&lfs, name);
  140. assert(!err || err == LFS_ERR_NOENT);
  141. }
  142. BENCH_STOP();
  143. lfs_unmount(&lfs) => 0;
  144. '''
  145. [cases.bench_dir_read]
  146. defines.N = 1024
  147. defines.FILE_SIZE = 8
  148. defines.CHUNK_SIZE = 8
  149. code = '''
  150. lfs_t lfs;
  151. lfs_format(&lfs, cfg) => 0;
  152. lfs_mount(&lfs, cfg) => 0;
  153. // first create the files
  154. char name[256];
  155. uint8_t buffer[CHUNK_SIZE];
  156. for (lfs_size_t i = 0; i < N; i++) {
  157. sprintf(name, "file%08x", i);
  158. lfs_file_t file;
  159. lfs_file_open(&lfs, &file, name,
  160. LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
  161. uint32_t file_prng = i;
  162. for (lfs_size_t j = 0; j < FILE_SIZE; j += CHUNK_SIZE) {
  163. for (lfs_size_t k = 0; k < CHUNK_SIZE; k++) {
  164. buffer[k] = xorshift32(&file_prng);
  165. }
  166. lfs_file_write(&lfs, &file, buffer, CHUNK_SIZE) => CHUNK_SIZE;
  167. }
  168. lfs_file_close(&lfs, &file) => 0;
  169. }
  170. // then read the directory
  171. BENCH_START();
  172. lfs_dir_t dir;
  173. lfs_dir_open(&lfs, &dir, "/") => 0;
  174. struct lfs_info info;
  175. lfs_dir_read(&lfs, &dir, &info) => 1;
  176. assert(info.type == LFS_TYPE_DIR);
  177. assert(strcmp(info.name, ".") == 0);
  178. lfs_dir_read(&lfs, &dir, &info) => 1;
  179. assert(info.type == LFS_TYPE_DIR);
  180. assert(strcmp(info.name, "..") == 0);
  181. for (int i = 0; i < N; i++) {
  182. sprintf(name, "file%08x", i);
  183. lfs_dir_read(&lfs, &dir, &info) => 1;
  184. assert(info.type == LFS_TYPE_REG);
  185. assert(strcmp(info.name, name) == 0);
  186. }
  187. lfs_dir_read(&lfs, &dir, &info) => 0;
  188. lfs_dir_close(&lfs, &dir) => 0;
  189. BENCH_STOP();
  190. lfs_unmount(&lfs) => 0;
  191. '''
  192. [cases.bench_dir_mkdir]
  193. # 0 = in-order
  194. # 1 = reversed-order
  195. # 2 = random-order
  196. defines.ORDER = [0, 1, 2]
  197. defines.N = 8
  198. code = '''
  199. lfs_t lfs;
  200. lfs_format(&lfs, cfg) => 0;
  201. lfs_mount(&lfs, cfg) => 0;
  202. BENCH_START();
  203. uint32_t prng = 42;
  204. char name[256];
  205. for (lfs_size_t i = 0; i < N; i++) {
  206. lfs_off_t i_
  207. = (ORDER == 0) ? i
  208. : (ORDER == 1) ? (N-1-i)
  209. : xorshift32(&prng) % N;
  210. printf("hm %d\n", i);
  211. sprintf(name, "dir%08x", i_);
  212. int err = lfs_mkdir(&lfs, name);
  213. assert(!err || err == LFS_ERR_EXIST);
  214. }
  215. BENCH_STOP();
  216. lfs_unmount(&lfs) => 0;
  217. '''
  218. [cases.bench_dir_rmdir]
  219. # 0 = in-order
  220. # 1 = reversed-order
  221. # 2 = random-order
  222. defines.ORDER = [0, 1, 2]
  223. defines.N = 8
  224. code = '''
  225. lfs_t lfs;
  226. lfs_format(&lfs, cfg) => 0;
  227. lfs_mount(&lfs, cfg) => 0;
  228. // first create the dirs
  229. char name[256];
  230. for (lfs_size_t i = 0; i < N; i++) {
  231. sprintf(name, "dir%08x", i);
  232. lfs_mkdir(&lfs, name) => 0;
  233. }
  234. // then remove the dirs
  235. BENCH_START();
  236. uint32_t prng = 42;
  237. for (lfs_size_t i = 0; i < N; i++) {
  238. lfs_off_t i_
  239. = (ORDER == 0) ? i
  240. : (ORDER == 1) ? (N-1-i)
  241. : xorshift32(&prng) % N;
  242. sprintf(name, "dir%08x", i_);
  243. int err = lfs_remove(&lfs, name);
  244. assert(!err || err == LFS_ERR_NOENT);
  245. }
  246. BENCH_STOP();
  247. lfs_unmount(&lfs) => 0;
  248. '''