Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
perf: [BTreeMap V2] avoid allocating large buffer on save. (#131)
When saving a BTreeMap V2 node, a large buffer was allocated where we first serialize the node, and then at a later stage we break this buffer into smaller pages and write those into stable memory. This was simpler to implement, yet inefficient. This PR removes the large buffer allocation and instead uses a `NodeWriter`, which write the node incrementally without the need to allocate large buffers on the heap. This narrows the performance gap even further between v1 and v2 as seen by the following benchmark report. ``` --------------------------------------------------- Benchmark: memory_manager_baseline measurements: instructions: 1176576551 (0.00%) (no change) stable_memory_size: 8000 (0.00%) (no change) --------------------------------------------------- Benchmark: memory_manager_overhead measurements: instructions: 1182012269 (0.00%) (no change) stable_memory_size: 8321 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_10mib_values measurements: instructions: 158321842 (improved by 43.10%) node_load_v2: 10377468 (0.00%) (no change) node_save_v2: 126007892 (improved by 48.77%) stable_memory_size: 33 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_4_1024 measurements: instructions: 938459480 (-0.04%) (change within noise threshold) node_load_v1: 246219371 (0.00%) (no change) node_save_v1: 369888833 (-0.06%) (change within noise threshold) stable_memory_size: 124 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_4_1024_v2 measurements: instructions: 1033183548 (improved by 19.60%) node_load_v2: 302721338 (0.05%) (change within noise threshold) node_save_v2: 410566944 (improved by 37.92%) stable_memory_size: 124 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_8_1024 measurements: instructions: 1084454578 (-0.04%) (change within noise threshold) node_load_v1: 286595797 (0.00%) (no change) node_save_v1: 394091363 (-0.06%) (change within noise threshold) stable_memory_size: 184 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_8_1024_v2 measurements: instructions: 1183969018 (improved by 18.83%) node_load_v2: 344994802 (0.06%) (change within noise threshold) node_save_v2: 438155700 (improved by 38.45%) stable_memory_size: 184 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_16_1024 measurements: instructions: 1176903332 (-0.04%) (change within noise threshold) node_load_v1: 362914338 (0.00%) (no change) node_save_v1: 403232566 (-0.06%) (change within noise threshold) stable_memory_size: 216 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_16_1024_v2 measurements: instructions: 1295546890 (improved by 18.44%) node_load_v2: 440399043 (0.04%) (change within noise threshold) node_save_v2: 448818266 (improved by 39.36%) stable_memory_size: 216 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_32_1024 measurements: instructions: 1224078359 (-0.04%) (change within noise threshold) node_load_v1: 390780802 (0.00%) (no change) node_save_v1: 415591575 (-0.06%) (change within noise threshold) stable_memory_size: 231 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_32_1024_v2 measurements: instructions: 1345918082 (improved by 18.72%) node_load_v2: 477582317 (0.00%) (change within noise threshold) node_save_v2: 461418653 (improved by 40.01%) stable_memory_size: 231 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_64_1024 measurements: instructions: 1463634810 (-0.04%) (change within noise threshold) node_load_v1: 595998298 (0.00%) (no change) node_save_v1: 418506217 (-0.06%) (change within noise threshold) stable_memory_size: 246 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_64_1024_v2 measurements: instructions: 1606536169 (improved by 16.71%) node_load_v2: 692239035 (0.00%) (change within noise threshold) node_save_v2: 464863981 (improved by 40.82%) stable_memory_size: 246 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_128_1024 measurements: instructions: 1729768012 (-0.03%) (change within noise threshold) node_load_v1: 818923030 (0.00%) (no change) node_save_v1: 424336331 (-0.06%) (change within noise threshold) stable_memory_size: 261 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_128_1024_v2 measurements: instructions: 1885672741 (improved by 15.47%) node_load_v2: 916598797 (0.01%) (change within noise threshold) node_save_v2: 470957703 (improved by 42.16%) stable_memory_size: 261 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_256_1024 measurements: instructions: 2255269553 (-0.02%) (change within noise threshold) node_load_v1: 1272224795 (0.00%) (no change) node_save_v1: 429936500 (-0.06%) (change within noise threshold) stable_memory_size: 293 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_256_1024_v2 measurements: instructions: 2416164659 (improved by 13.54%) node_load_v2: 1368714490 (0.00%) (change within noise threshold) node_save_v2: 476456802 (improved by 44.08%) stable_memory_size: 293 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_512_1024 measurements: instructions: 3306266369 (-0.02%) (change within noise threshold) node_load_v1: 2162164471 (0.00%) (no change) node_save_v1: 447224687 (-0.05%) (change within noise threshold) stable_memory_size: 352 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_512_1024_v2 measurements: instructions: 3439168228 (improved by 11.86%) node_load_v2: 2249806809 (0.00%) (change within noise threshold) node_save_v2: 493589161 (improved by 48.25%) stable_memory_size: 352 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_u64_u64 measurements: instructions: 771295973 (-0.07%) (change within noise threshold) node_load_v1: 274520203 (0.00%) (no change) node_save_v1: 266429035 (-0.04%) (change within noise threshold) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_u64_u64_v2 measurements: instructions: 844848075 (0.27%) (change within noise threshold) node_load_v2: 320667801 (-0.09%) (change within noise threshold) node_save_v2: 298115032 (0.97%) (change within noise threshold) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_u64_blob_8 measurements: instructions: 749642151 (-0.07%) (change within noise threshold) node_load_v1: 276866073 (0.00%) (no change) node_save_v1: 255566331 (-0.04%) (change within noise threshold) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_u64_blob_8_v2 measurements: instructions: 820358615 (1.77%) (change within noise threshold) node_load_v2: 320406521 (0.02%) (change within noise threshold) node_save_v2: 287445446 (regressed by 5.64%) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_8_u64 measurements: instructions: 684209106 (-0.07%) (change within noise threshold) node_load_v1: 277937358 (0.00%) (no change) node_save_v1: 189165744 (-0.12%) (change within noise threshold) stable_memory_size: 7 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_insert_blob_8_u64_v2 measurements: instructions: 802688497 (0.48%) (change within noise threshold) node_load_v2: 354976358 (0.05%) (change within noise threshold) node_save_v2: 234878135 (regressed by 2.23%) stable_memory_size: 7 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_4_1024 measurements: instructions: 401718154 (0.00%) (no change) node_load_v1: 259275488 (0.00%) (no change) stable_memory_size: 124 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_4_1024_v2 measurements: instructions: 480241876 (0.00%) (no change) node_load_v2: 329436785 (0.00%) (no change) stable_memory_size: 124 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_8_1024 measurements: instructions: 473964224 (0.00%) (no change) node_load_v1: 304258691 (0.00%) (no change) stable_memory_size: 184 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_8_1024_v2 measurements: instructions: 549627424 (0.00%) (no change) node_load_v2: 371386524 (0.00%) (no change) stable_memory_size: 184 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_16_1024 measurements: instructions: 553966238 (0.00%) (no change) node_load_v1: 383794822 (0.00%) (no change) stable_memory_size: 216 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_16_1024_v2 measurements: instructions: 637391324 (0.00%) (no change) node_load_v2: 464133703 (0.00%) (no change) stable_memory_size: 216 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_32_1024 measurements: instructions: 591716960 (0.00%) (no change) node_load_v1: 410436451 (0.00%) (no change) stable_memory_size: 231 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_32_1024_v2 measurements: instructions: 679662006 (0.00%) (no change) node_load_v2: 495574095 (0.00%) (no change) stable_memory_size: 231 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_64_1024 measurements: instructions: 814621589 (0.00%) (no change) node_load_v1: 627796876 (0.00%) (no change) stable_memory_size: 246 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_64_1024_v2 measurements: instructions: 902934555 (0.00%) (no change) node_load_v2: 708745655 (0.00%) (no change) stable_memory_size: 246 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_128_1024 measurements: instructions: 1036041908 (0.00%) (no change) node_load_v1: 839537545 (0.00%) (no change) stable_memory_size: 261 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_128_1024_v2 measurements: instructions: 1140173858 (0.00%) (change within noise threshold) node_load_v2: 933785784 (0.00%) (no change) stable_memory_size: 261 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_u64_u64 measurements: instructions: 412643077 (0.00%) (no change) node_load_v1: 290922161 (0.00%) (no change) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_u64_u64_v2 measurements: instructions: 469869306 (0.00%) (change within noise threshold) node_load_v2: 341278594 (0.00%) (no change) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_u64_blob_8 measurements: instructions: 409579480 (0.00%) (no change) node_load_v1: 292395667 (0.00%) (no change) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_u64_blob_8_v2 measurements: instructions: 465392638 (0.00%) (change within noise threshold) node_load_v2: 342799065 (0.00%) (no change) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_8_u64 measurements: instructions: 426482546 (0.00%) (no change) node_load_v1: 294602061 (0.00%) (no change) stable_memory_size: 7 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_8_u64_v2 measurements: instructions: 511860381 (-0.00%) (change within noise threshold) node_load_v2: 373992060 (0.00%) (no change) stable_memory_size: 7 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_256_1024 measurements: instructions: 1523593515 (0.00%) (no change) node_load_v1: 1301924960 (0.00%) (no change) stable_memory_size: 293 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_256_1024_v2 measurements: instructions: 1628351272 (0.00%) (change within noise threshold) node_load_v2: 1392993062 (0.00%) (no change) stable_memory_size: 293 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_512_1024 measurements: instructions: 2489215042 (0.00%) (no change) node_load_v1: 2219164452 (0.00%) (no change) stable_memory_size: 352 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_get_blob_512_1024_v2 measurements: instructions: 2596163236 (0.00%) (no change) node_load_v2: 2312346281 (0.00%) (no change) stable_memory_size: 352 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_4_1024 measurements: instructions: 1005989932 (-0.05%) (change within noise threshold) node_load_v1: 269171795 (0.00%) (no change) node_save_v1: 420883123 (-0.07%) (change within noise threshold) stable_memory_size: 124 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_4_1024_v2 measurements: instructions: 1123916215 (improved by 20.72%) node_load_v2: 334520048 (0.11%) (change within noise threshold) node_save_v2: 477506500 (improved by 38.09%) stable_memory_size: 124 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_8_1024 measurements: instructions: 1299825273 (-0.05%) (change within noise threshold) node_load_v1: 325916114 (0.00%) (no change) node_save_v1: 561793980 (-0.07%) (change within noise threshold) stable_memory_size: 184 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_8_1024_v2 measurements: instructions: 1435762834 (improved by 22.05%) node_load_v2: 391933707 (0.13%) (change within noise threshold) node_save_v2: 638595044 (improved by 38.92%) stable_memory_size: 184 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_16_1024 measurements: instructions: 1544195176 (-0.05%) (change within noise threshold) node_load_v1: 420249550 (0.00%) (no change) node_save_v1: 653989748 (-0.07%) (change within noise threshold) stable_memory_size: 216 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_16_1024_v2 measurements: instructions: 1718977571 (improved by 22.52%) node_load_v2: 514792050 (0.16%) (change within noise threshold) node_save_v2: 742821168 (improved by 40.28%) stable_memory_size: 216 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_32_1024 measurements: instructions: 1622025795 (-0.05%) (change within noise threshold) node_load_v1: 443614945 (0.00%) (no change) node_save_v1: 680680401 (-0.07%) (change within noise threshold) stable_memory_size: 231 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_32_1024_v2 measurements: instructions: 1805728812 (improved by 22.42%) node_load_v2: 545888022 (-0.01%) (change within noise threshold) node_save_v2: 773231206 (improved by 40.34%) stable_memory_size: 231 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_64_1024 measurements: instructions: 1916261049 (-0.04%) (change within noise threshold) node_load_v1: 675469604 (0.00%) (no change) node_save_v1: 699843250 (-0.07%) (change within noise threshold) stable_memory_size: 246 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_64_1024_v2 measurements: instructions: 2111770035 (improved by 20.73%) node_load_v2: 783191220 (0.01%) (change within noise threshold) node_save_v2: 795030992 (improved by 41.02%) stable_memory_size: 246 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_128_1024 measurements: instructions: 2235786044 (-0.04%) (change within noise threshold) node_load_v1: 922607545 (0.00%) (no change) node_save_v1: 716437888 (-0.07%) (change within noise threshold) stable_memory_size: 261 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_128_1024_v2 measurements: instructions: 2434217251 (improved by 19.70%) node_load_v2: 1029552036 (0.01%) (change within noise threshold) node_save_v2: 813731257 (improved by 42.38%) stable_memory_size: 261 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_256_1024 measurements: instructions: 2838422216 (-0.03%) (change within noise threshold) node_load_v1: 1421754484 (0.00%) (no change) node_save_v1: 722240539 (-0.06%) (change within noise threshold) stable_memory_size: 293 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_256_1024_v2 measurements: instructions: 3039500513 (improved by 17.77%) node_load_v2: 1528561438 (0.00%) (change within noise threshold) node_save_v2: 816969139 (improved by 44.62%) stable_memory_size: 293 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_512_1024 measurements: instructions: 4123516635 (-0.02%) (change within noise threshold) node_load_v1: 2441544783 (0.00%) (no change) node_save_v1: 764541981 (-0.06%) (change within noise threshold) stable_memory_size: 352 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_512_1024_v2 measurements: instructions: 4332567176 (improved by 15.86%) node_load_v2: 2551503756 (0.00%) (change within noise threshold) node_save_v2: 863236858 (improved by 48.61%) stable_memory_size: 352 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_u64_u64 measurements: instructions: 1109353494 (-0.07%) (change within noise threshold) node_load_v1: 314148033 (0.00%) (no change) node_save_v1: 482917665 (-0.04%) (change within noise threshold) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_u64_u64_v2 measurements: instructions: 1227062933 (regressed by 3.84%) node_load_v2: 366608916 (0.52%) (change within noise threshold) node_save_v2: 543163993 (regressed by 7.81%) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_u64_blob_8 measurements: instructions: 1072102455 (-0.07%) (change within noise threshold) node_load_v1: 313757215 (0.00%) (no change) node_save_v1: 457512144 (-0.04%) (change within noise threshold) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_u64_blob_8_v2 measurements: instructions: 1186857459 (regressed by 5.17%) node_load_v2: 364726642 (0.50%) (change within noise threshold) node_save_v2: 517296661 (regressed by 11.50%) stable_memory_size: 8 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_8_u64 measurements: instructions: 903169486 (-0.07%) (change within noise threshold) node_load_v1: 318747944 (0.00%) (no change) node_save_v1: 301798231 (-0.13%) (change within noise threshold) stable_memory_size: 7 (0.00%) (no change) --------------------------------------------------- Benchmark: btreemap_remove_blob_8_u64_v2 measurements: instructions: 1066956998 (regressed by 2.69%) node_load_v2: 399537975 (0.60%) (change within noise threshold) node_save_v2: 382247298 (regressed by 5.77%) stable_memory_size: 7 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_insert_blob_4 measurements: instructions: 5187495 (0.00%) (no change) stable_memory_size: 1 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_insert_blob_8 measurements: instructions: 5216814 (0.00%) (no change) stable_memory_size: 2 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_insert_blob_16 measurements: instructions: 5186050 (0.00%) (no change) stable_memory_size: 3 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_insert_blob_32 measurements: instructions: 5394984 (0.00%) (no change) stable_memory_size: 6 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_insert_blob_128 measurements: instructions: 6109513 (0.00%) (no change) stable_memory_size: 20 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_insert_u64 measurements: instructions: 12149357 (0.00%) (no change) stable_memory_size: 2 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_get_blob_4 measurements: instructions: 10027133 (0.00%) (no change) stable_memory_size: 1 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_get_blob_8 measurements: instructions: 11988806 (0.00%) (no change) stable_memory_size: 2 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_get_blob_16 measurements: instructions: 14914959 (0.00%) (no change) stable_memory_size: 3 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_get_blob_32 measurements: instructions: 15584015 (0.00%) (no change) stable_memory_size: 6 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_get_blob_128 measurements: instructions: 25331980 (0.00%) (no change) stable_memory_size: 20 (0.00%) (no change) --------------------------------------------------- Benchmark: vec_get_u64 measurements: instructions: 11430290 (0.00%) (no change) stable_memory_size: 2 (0.00%) (no change) Successfully persisted results to results.yml ```
- Loading branch information