Skip to content

Commit

Permalink
perf: [BTreeMap V2] avoid allocating large buffer on save. (#131)
Browse files Browse the repository at this point in the history
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
ielashi authored Sep 19, 2023
1 parent 5de8355 commit add7c67
Show file tree
Hide file tree
Showing 6 changed files with 623 additions and 401 deletions.
Loading

0 comments on commit add7c67

Please sign in to comment.