Skip to content

perf: use size with offset in lazy loading BTreeMap items#337

Merged
maksymar merged 13 commits intomainfrom
maksym/size
Jun 6, 2025
Merged

perf: use size with offset in lazy loading BTreeMap items#337
maksymar merged 13 commits intomainfrom
maksym/size

Conversation

@maksymar
Copy link
Copy Markdown
Contributor

@maksymar maksymar commented Jun 6, 2025

This PR improves performance by removing duplicated reads of lazy object size.

Lazy objects had duplicated reads for the size of the stored data. First when it lazily stores the object by reference (it needs to know the size of the data to advance the offset). And then the second time when the object needs to be downloaded.

Now the size of the data is stored next to the offset on the first read and skipped reading on the second one.

Google sheets CSV reports.

btreemap regressed: 11, instructions Δ%: max +3.81% 🔴
btreemap improved: 70, instructions Δ%: min -5.42%, median -1.15% 🟢

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 6, 2025

canbench 🏋 (dir: ./benchmarks/compare) 80cf95e 2025-06-06 11:20:27 UTC

./benchmarks/compare/canbench_results.yml is up to date
📦 canbench_results_compare.csv available in artifacts

---------------------------------------------------

Summary:
  instructions:
    status:   No significant changes detected 👍
    counts:   [total 18 | regressed 0 | improved 0 | new 0 | unchanged 18]
    change:   [max +994.03M | p75 +3.00M | median 0 | p25 0 | min 0]
    change %: [max +0.91% | p75 +0.15% | median 0.00% | p25 0.00% | min 0.00%]

  heap_increase:
    status:   No significant changes detected 👍
    counts:   [total 18 | regressed 0 | improved 0 | new 0 | unchanged 18]
    change:   [max 0 | p75 0 | median 0 | p25 0 | min 0]
    change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]

  stable_memory_increase:
    status:   No significant changes detected 👍
    counts:   [total 18 | regressed 0 | improved 0 | new 0 | unchanged 18]
    change:   [max 0 | p75 0 | median 0 | p25 0 | min 0]
    change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]

---------------------------------------------------
CSV results saved to canbench_results.csv

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 6, 2025

canbench 🏋 (dir: ./benchmarks/vec) 80cf95e 2025-06-06 11:19:32 UTC

./benchmarks/vec/canbench_results.yml is up to date
📦 canbench_results_vec.csv available in artifacts

---------------------------------------------------

Summary:
  instructions:
    status:   No significant changes detected 👍
    counts:   [total 16 | regressed 0 | improved 0 | new 0 | unchanged 16]
    change:   [max 0 | p75 0 | median 0 | p25 0 | min 0]
    change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]

  heap_increase:
    status:   No significant changes detected 👍
    counts:   [total 16 | regressed 0 | improved 0 | new 0 | unchanged 16]
    change:   [max 0 | p75 0 | median 0 | p25 0 | min 0]
    change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]

  stable_memory_increase:
    status:   No significant changes detected 👍
    counts:   [total 16 | regressed 0 | improved 0 | new 0 | unchanged 16]
    change:   [max 0 | p75 0 | median 0 | p25 0 | min 0]
    change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]

---------------------------------------------------
CSV results saved to canbench_results.csv

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 6, 2025

canbench 🏋 (dir: ./benchmarks/btreemap) 80cf95e 2025-06-06 11:21:24 UTC

./benchmarks/btreemap/canbench_results.yml is up to date
📦 canbench_results_btreemap.csv available in artifacts

---------------------------------------------------

Summary:
  instructions:
    status:   Both regressions and improvements detected! 🔴🟢
    counts:   [total 285 | regressed 11 | improved 70 | new 0 | unchanged 204]
    change:   [max +15.59M | p75 -199.06K | median -8.18M | p25 -19.58M | min -115.85M]
    change %: [max +3.81% | p75 -0.23% | median -1.15% | p25 -1.99% | min -5.42%]

  heap_increase:
    status:   No significant changes detected 👍
    counts:   [total 285 | regressed 0 | improved 0 | new 0 | unchanged 285]
    change:   [max 0 | p75 0 | median 0 | p25 0 | min 0]
    change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]

  stable_memory_increase:
    status:   No significant changes detected 👍
    counts:   [total 285 | regressed 0 | improved 0 | new 0 | unchanged 285]
    change:   [max 0 | p75 0 | median 0 | p25 0 | min 0]
    change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]

---------------------------------------------------

Only significant changes:
| status | name                                        | calls |     ins |  ins Δ% | HI |  HI Δ% | SMI |  SMI Δ% |
|--------|---------------------------------------------|-------|---------|---------|----|--------|-----|---------|
|   +    | btreemap_v2_get_blob8_u64                   |       | 305.72M |  +3.81% |  0 |  0.00% |   0 |   0.00% |
|   +    | btreemap_v2_contains_vec_4_128              |       | 413.00M |  +3.71% |  0 |  0.00% |   0 |   0.00% |
|   +    | btreemap_v2_contains_vec_16_128             |       | 448.38M |  +3.60% |  0 |  0.00% |   0 |   0.00% |
|   +    | btreemap_v2_range_count_1k_0b               |       |  17.32K |  +3.45% |  0 |  0.00% |   0 |   0.00% |
|   +    | btreemap_v2_get_vec_4_128                   |       | 421.11M |  +3.42% |  0 |  0.00% |   0 |   0.00% |
|   +    | btreemap_v2_get_vec_16_128                  |       | 456.73M |  +3.26% |  0 |  0.00% |   0 |   0.00% |
|   +    | btreemap_v2_range_key_sum_1k_0b             |       |  17.57K |  +2.71% |  0 |  0.00% |   0 |   0.00% |
|   +    | btreemap_v2_range_value_sum_1k_0b           |       |  17.58K |  +2.71% |  0 |  0.00% |   0 |   0.00% |
|   +    | btreemap_v2_contains_vec_32_16              |       | 375.07M |  +2.17% |  0 |  0.00% |   0 |   0.00% |
|   +    | btreemap_v2_contains_vec_128_128            |       | 574.28M |  +2.01% |  0 |  0.00% |   0 |   0.00% |
|   +    | btreemap_v2_range_count_1k_10kib            |       |   2.65M |  +2.01% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_pop_last_vec_32_4               |       | 921.40M |  -2.02% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_pop_last_vec_32_16              |       | 925.17M |  -2.02% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_contains_vec_32_128             |       | 428.71M |  -2.03% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_pop_last_blob_32_8              |       | 790.95M |  -2.03% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_pop_last_blob_32_32             |       | 798.91M |  -2.04% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_get_vec_512_128                 |       |   1.26B |  -2.07% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_insert_blob_32_128              |       | 551.94M |  -2.07% |  0 |  0.00% |  28 |   0.00% |
|   -    | btreemap_v2_pop_last_blob_32_4              |       | 776.95M |  -2.10% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_insert_blob_32_256              |       | 580.54M |  -2.10% |  0 |  0.00% |  49 |   0.00% |
|   -    | btreemap_v2_insert_vec_64_128               |       | 855.97M |  -2.12% |  0 |  0.00% |  41 |   0.00% |
|   -    | btreemap_v2_pop_last_blob_64_128            |       |   1.02B |  -2.15% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_remove_blob_32_512              |       | 872.04M |  -2.18% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_pop_last_vec_32_128             |       |   1.08B |  -2.20% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_pop_first_vec_32_512            |       |   1.37B |  -2.20% |  0 |  0.00% |   0 |   0.00% |
|  ...   | ... 31 rows omitted ...                     |       |         |         |    |        |     |         |
|   -    | btreemap_v2_remove_blob_32_4                |       | 712.64M |  -2.67% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_remove_blob_32_8                |       | 712.28M |  -2.71% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_insert_vec_32_512               |       | 998.46M |  -2.73% |  0 |  0.00% |  91 |   0.00% |
|   -    | btreemap_v2_insert_vec_128_128              |       |   1.01B |  -2.75% |  0 |  0.00% |  51 |   0.00% |
|   -    | btreemap_v2_remove_vec_32_128               |       |   1.04B |  -2.77% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_mem_manager_insert_u64_vec512   |       | 875.57M |  -2.77% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_mem_manager_contains_vec512_u64 |       |   1.23B |  -2.78% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_get_vec_1024_128                |       |   1.84B |  -2.87% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_pop_last_vec_512_128            |       |   2.79B |  -2.88% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_remove_vec_128_128              |       |   1.42B |  -2.89% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_pop_last_vec_128_128            |       |   1.51B |  -2.90% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_remove_vec_32_512               |       |   1.40B |  -2.90% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_mem_manager_get_vec512_u64      |       |   1.27B |  -2.93% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_mem_manager_remove_u64_u64      |       | 783.43M |  -3.07% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_pop_last_vec_256_128            |       |   2.07B |  -3.12% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_remove_vec_256_128              |       |   2.22B |  -3.15% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_mem_manager_remove_vec512_u64   |       |   3.08B |  -3.39% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_mem_manager_remove_u64_vec512   |       |   1.25B |  -3.40% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_mem_manager_insert_vec512_u64   |       |   1.96B |  -3.48% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_contains_vec_32_512             |       | 460.61M |  -4.23% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_get_vec_32_512                  |       | 480.05M |  -4.54% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_scan_iter_1k_0b                 |       |   1.46M |  -5.37% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_scan_values_1k_0b               |       |   1.43M |  -5.39% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_scan_iter_rev_1k_0b             |       |   1.46M |  -5.40% |  0 |  0.00% |   0 |   0.00% |
|   -    | btreemap_v2_scan_values_rev_1k_0b           |       |   1.44M |  -5.42% |  0 |  0.00% |   0 |   0.00% |

ins = instructions, HI = heap_increase, SMI = stable_memory_increase, Δ% = percent change

---------------------------------------------------
CSV results saved to canbench_results.csv

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 6, 2025

canbench 🏋 (dir: ./benchmarks/memory_manager) 80cf95e 2025-06-06 11:19:23 UTC

./benchmarks/memory_manager/canbench_results.yml is up to date
📦 canbench_results_memory-manager.csv available in artifacts

---------------------------------------------------

Summary:
  instructions:
    status:   No significant changes detected 👍
    counts:   [total 3 | regressed 0 | improved 0 | new 0 | unchanged 3]
    change:   [max 0 | p75 0 | median 0 | p25 0 | min 0]
    change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]

  heap_increase:
    status:   No significant changes detected 👍
    counts:   [total 3 | regressed 0 | improved 0 | new 0 | unchanged 3]
    change:   [max 0 | p75 0 | median 0 | p25 0 | min 0]
    change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]

  stable_memory_increase:
    status:   No significant changes detected 👍
    counts:   [total 3 | regressed 0 | improved 0 | new 0 | unchanged 3]
    change:   [max 0 | p75 0 | median 0 | p25 0 | min 0]
    change %: [max 0.00% | p75 0.00% | median 0.00% | p25 0.00% | min 0.00%]

---------------------------------------------------
CSV results saved to canbench_results.csv

@maksymar maksymar changed the title perf: read lazy size only once perf: read lazy object size only once Jun 6, 2025
@maksymar maksymar changed the title perf: read lazy object size only once perf: use size with offset in lazy loading Jun 6, 2025
@maksymar maksymar changed the title perf: use size with offset in lazy loading perf: use size with offset in lazy loading BTreeMap items Jun 6, 2025
Comment thread src/btreemap/node.rs
Comment thread src/btreemap/node.rs
Comment thread src/btreemap/node.rs
Comment thread src/btreemap/node/v1.rs
@maksymar maksymar marked this pull request as ready for review June 6, 2025 11:27
@maksymar maksymar requested a review from a team as a code owner June 6, 2025 11:27
@maksymar maksymar enabled auto-merge (squash) June 6, 2025 13:29
@maksymar maksymar merged commit e4b43e3 into main Jun 6, 2025
22 checks passed
@maksymar maksymar deleted the maksym/size branch June 6, 2025 13:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants