Skip to content

[CHIA-3002] Introduce reference counters for atoms and pairs in Allocator - #586

Closed
arvidn wants to merge 2 commits into
mainfrom
refcount
Closed

[CHIA-3002] Introduce reference counters for atoms and pairs in Allocator#586
arvidn wants to merge 2 commits into
mainfrom
refcount

Conversation

@arvidn

@arvidn arvidn commented Jun 11, 2025

Copy link
Copy Markdown
Contributor

These work as substitutes for node_from_bytes_backrefs_record(), which records which nodes are referenced more than once in deserialization. These are used for memoization in tree_hash_cached(). Using reference counters in the Allocator allows memoization of structures generated programmatically as well.

This change makes node_from_bytes_backrefs_record() obsolete, since the regular deserializer (node_from_bytes_backrefs()) also now records reused nodes.

Maintaining reference counts is not free, so this affects the benchmarks:

group                                                          main                    refcount
-----                                                          ----                    --------
deserialize/node_from_bytes                                    1.00    208.6±2.87µs    1.19    248.8±6.00µs
deserialize/node_from_bytes_backrefs                           1.00    224.4±3.02µs    1.30    291.2±4.60µs
deserialize/node_from_bytes_backrefs-compressed                1.00    209.5±2.92µs    1.30    272.9±8.44µs
deserialize/node_from_bytes_backrefs_old                       1.00    227.0±5.45µs    1.75    397.2±8.96µs
deserialize/node_from_bytes_backrefs_old-compressed            1.00   214.8±12.65µs    1.74   374.0±15.68µs
deserialize/serialized_length_from_bytes                       1.00    159.7±3.27µs    2.08    332.7±7.58µs
deserialize/serialized_length_from_bytes-compressed            1.00    174.0±4.40µs    1.89    329.2±7.87µs
deserialize/serialized_length_from_bytes_trusted               1.00     35.8±2.16µs    1.01     36.0±1.01µs
deserialize/serialized_length_from_bytes_trusted-compressed    1.13     33.2±0.39µs    1.00     29.5±0.55µs
deserialize/tree_hash_from_stream                              1.00      4.3±0.09ms    1.00      4.3±0.10ms
run_program/block-2000                                         1.02    145.1±1.32ns    1.00    142.6±1.25ns
run_program/compressed-2000                                    1.00    856.2±6.06ms    1.07   917.1±14.60ms
run_program/concat                                             1.00    332.1±2.62ms    1.37    456.0±3.26ms
run_program/count-even                                         1.00     12.5±0.29ms    1.09     13.6±0.16ms
run_program/factorial                                          1.07    151.2±1.94ms    1.00    141.0±0.88ms
run_program/hash-string                                        1.03    393.5±1.90ns    1.00    383.3±5.65ns
run_program/hash-tree                                          1.00     38.9±0.39ms    1.11     43.3±0.57ms
run_program/large-block                                        1.00    180.2±1.20ms    1.07    192.8±3.74ms
run_program/loop_add                                           1.00       3.0±0.02s    1.06       3.2±0.04s
run_program/loop_ior                                           1.00       3.0±0.05s    1.04       3.1±0.02s
run_program/loop_not                                           1.00       2.9±0.03s    1.05       3.1±0.06s
run_program/loop_sub                                           1.00       3.2±0.05s    1.03       3.3±0.02s
run_program/loop_xor                                           1.00       3.2±0.05s    1.04       3.3±0.02s
run_program/matrix-multiply                                    1.00    192.1±3.43ms    1.06    204.0±1.43ms
run_program/point-pow                                          1.00    200.7±0.34ms    1.01    202.7±4.59ms
run_program/pubkey-tree                                        1.00    110.9±0.72ms    1.01    111.9±1.10ms
run_program/shift-left                                         1.00  1789.4±14.19ms    1.02  1832.4±21.60ms
run_program/substr                                             1.00      7.5±0.05ms    1.01      7.6±0.07ms
run_program/substr-tree                                        1.00    136.8±0.46ms    1.02    139.5±0.53ms
run_program/sum-tree                                           1.00    319.9±4.56ms    1.11   356.7±10.57ms
serialize/Serializer 0                                         1.00    198.4±2.98ms    1.01    200.3±2.77ms
serialize/Serializer 1                                         1.01    175.0±7.71ms    1.00    173.6±4.22ms
serialize/Serializer 2                                         1.00    178.8±3.16µs    1.03    183.7±7.09µs
serialize/Serializer 3                                         1.00      2.6±0.03ms    1.03      2.6±0.06ms
serialize/Serializer 4                                         1.01   396.2±16.68µs    1.00    391.5±7.52µs
serialize/node_to_bytes_backrefs 0                             1.01    585.7±8.99ms    1.00   577.4±13.99ms
serialize/node_to_bytes_backrefs 1                             1.00    670.4±9.50ms    1.00    668.6±8.43ms
serialize/node_to_bytes_backrefs 2                             1.00  1302.7±27.14µs    1.03  1340.9±19.52µs
serialize/node_to_bytes_backrefs 3                             1.00     11.1±0.22ms    1.01     11.2±0.20ms
serialize/node_to_bytes_backrefs 4                             1.01  1336.0±25.11µs    1.00  1328.4±33.33µs
sha256_hash/hash_benchmark                                     1.00    475.3±8.10µs    1.00    476.7±5.23µs

The benchmarks in chia_rs (where tree hash is implemented) look like this:

group                                                        main                  memoized
-----                                                        ----                  --------
additions_and_removals block-1ee588dc                        1.00     36.0±0.22ms  1.02     36.8±0.35ms
additions_and_removals block-1ee588dc-compressed             1.00     11.5±0.06ms  1.01     11.6±0.03ms
additions_and_removals block-225758                          1.00      2.8±0.00ms  1.05      3.0±0.00ms
additions_and_removals block-225758-compressed               1.00      2.8±0.00ms  1.09      3.0±0.10ms
additions_and_removals block-4671894                         1.00    162.3±1.89ms  1.10    178.1±0.78ms
additions_and_removals block-4671894-compressed              1.00    163.4±0.62ms  1.09    178.2±3.48ms
additions_and_removals block-6fe59b24                        1.00     40.3±0.42ms  1.04     42.0±0.60ms
additions_and_removals block-6fe59b24-compressed             1.00     14.4±0.11ms  1.02     14.7±0.02ms
additions_and_removals block-834752                          1.00      3.5±0.02ms  1.06      3.7±0.01ms
additions_and_removals block-834752-compressed               1.00   1954.8±5.06µs  1.03      2.0±0.01ms
additions_and_removals block-b45268ac                        1.00     35.3±0.15ms  1.05     36.9±0.76ms
additions_and_removals block-b45268ac-compressed             1.00     11.8±0.07ms  1.03     12.1±0.42ms
additions_and_removals block-c2a8df0d                        1.00     41.0±0.06ms  1.02     42.0±0.44ms
additions_and_removals block-c2a8df0d-compressed             1.00     11.2±0.11ms  1.07     11.9±0.07ms
additions_and_removals block-e5002df2                        1.00     37.7±0.26ms  1.04     39.2±0.43ms
additions_and_removals block-e5002df2-compressed             1.00     12.8±0.01ms  1.07     13.7±0.15ms
additions_and_removals deep-recursion-plus                   1.00  1209.1±35.77ms  1.02   1237.4±3.29ms
additions_and_removals deep-recursion-plus-compressed        1.00   1186.6±1.18ms  1.04   1236.5±2.29ms
additions_and_removals duplicate-coin-announce               1.00   1215.0±2.67ms  1.04  1261.3±13.14ms
additions_and_removals duplicate-coin-announce-compressed    1.00  1218.9±12.39ms  1.04  1266.7±18.82ms
additions_and_removals recursion-pairs                       1.00    876.0±0.87ms  1.06    928.6±2.03ms
additions_and_removals recursion-pairs-compressed            1.00    874.2±0.48ms  1.06    929.7±1.10ms
run_block_generator block-1ee588dc                           1.00    102.2±0.20ms  1.04    106.3±0.52ms
run_block_generator block-1ee588dc-compressed                1.00    101.7±0.19ms  1.04    105.4±0.19ms
run_block_generator block-225758                             1.00      3.9±0.06ms  1.09      4.3±0.17ms
run_block_generator block-225758-compressed                  1.00      3.9±0.02ms  1.04      4.1±0.01ms
run_block_generator block-4671894                            1.00    227.0±0.54ms  1.06    240.0±8.53ms
run_block_generator block-4671894-compressed                 1.00    233.8±9.18ms  1.02    239.2±0.58ms
run_block_generator block-6fe59b24                           1.00    109.1±0.19ms  1.05    114.3±4.29ms
run_block_generator block-6fe59b24-compressed                1.00    108.5±1.07ms  1.04    112.7±1.06ms
run_block_generator block-834752                             1.00      6.7±0.01ms  1.09      7.3±0.52ms
run_block_generator block-834752-compressed                  1.00      6.8±0.42ms  1.01      6.9±0.04ms
run_block_generator block-b45268ac                           1.00    100.0±0.29ms  1.08    107.8±4.87ms
run_block_generator block-b45268ac-compressed                1.00    100.3±0.72ms  1.02    102.0±0.49ms
run_block_generator block-c2a8df0d                           1.00    121.1±3.68ms  1.01    122.7±0.42ms
run_block_generator block-c2a8df0d-compressed                1.00    118.8±0.27ms  1.03    121.9±0.60ms
run_block_generator block-e5002df2                           1.00    104.4±0.53ms  1.17   122.4±21.08ms
run_block_generator block-e5002df2-compressed                1.00    104.4±0.10ms  1.03    107.6±0.66ms
run_block_generator deep-recursion-plus                      1.00   1188.3±2.14ms  1.04   1231.8±1.59ms
run_block_generator deep-recursion-plus-compressed           1.00  1210.6±69.36ms  1.02   1230.5±2.18ms
run_block_generator duplicate-coin-announce                  1.00   1220.4±8.90ms  1.03  1261.5±19.11ms
run_block_generator duplicate-coin-announce-compressed       1.00   1220.0±7.52ms  1.05  1284.6±15.41ms
run_block_generator recursion-pairs                          1.00    879.7±9.76ms  1.06    929.6±1.31ms
run_block_generator recursion-pairs-compressed               1.00    875.8±0.57ms  1.06    928.1±2.17ms
run_block_generator2 block-1ee588dc                          1.00    272.7±0.64ms  1.03   281.0±11.34ms
run_block_generator2 block-1ee588dc-compressed               1.00    247.6±0.66ms  1.02    251.4±1.24ms
run_block_generator2 block-225758                            1.00      7.7±0.06ms  1.04      8.0±0.02ms
run_block_generator2 block-225758-compressed                 1.00      7.8±0.04ms  1.03      8.0±0.03ms
run_block_generator2 block-4671894                           1.00    403.6±0.80ms  1.06    427.8±4.83ms
run_block_generator2 block-4671894-compressed                1.00    406.1±3.15ms  1.07   436.2±18.54ms
run_block_generator2 block-6fe59b24                          1.02   266.5±11.56ms  1.00    262.3±1.58ms
run_block_generator2 block-6fe59b24-compressed               1.00    232.9±0.31ms  1.02    238.0±3.46ms
run_block_generator2 block-834752                            1.00      6.5±0.04ms  1.04      6.8±0.02ms
run_block_generator2 block-834752-compressed                 1.00      5.0±0.01ms  1.02      5.1±0.02ms
run_block_generator2 block-b45268ac                          1.00    261.1±0.75ms  1.06   277.9±47.53ms
run_block_generator2 block-b45268ac-compressed               1.00    237.5±1.11ms  1.00    238.7±0.61ms
run_block_generator2 block-c2a8df0d                          1.00    307.3±0.65ms  1.01    311.6±1.10ms
run_block_generator2 block-c2a8df0d-compressed               1.00    277.6±0.78ms  1.02    282.8±1.07ms
run_block_generator2 block-e5002df2                          1.00    261.8±0.18ms  1.00    263.0±0.90ms
run_block_generator2 block-e5002df2-compressed               1.00    236.5±1.04ms  1.02    240.7±0.79ms
run_block_generator2 deep-recursion-plus                     1.00   1192.0±2.25ms  1.05  1249.3±32.06ms
run_block_generator2 deep-recursion-plus-compressed          1.00   1189.1±7.80ms  1.04   1235.0±1.69ms
run_block_generator2 duplicate-coin-announce                 1.00   1216.8±5.06ms  1.03   1255.6±3.29ms
run_block_generator2 duplicate-coin-announce-compressed      1.00  1228.9±32.10ms  1.02   1254.9±1.52ms
run_block_generator2 recursion-pairs                         1.00    875.1±0.42ms  1.08   942.6±22.28ms
run_block_generator2 recursion-pairs-compressed              1.00    875.1±1.33ms  1.08   944.0±23.21ms
tree-hash block-1ee588dc                                     1.00     30.7±0.25ms  1.00     30.8±0.22ms
tree-hash block-1ee588dc-compressed                          1.00     30.6±0.09ms  1.02     31.2±0.15ms
tree-hash block-225758                                       1.00    133.0±0.87µs  1.00    133.6±2.69µs
tree-hash block-225758-compressed                            1.00    132.7±0.23µs  1.01    133.4±0.99µs
tree-hash block-4671894                                      1.02      6.3±0.33ms  1.00      6.3±0.03ms
tree-hash block-4671894-compressed                           1.00      6.2±0.05ms  1.01      6.3±0.04ms
tree-hash block-6fe59b24                                     1.00     33.3±0.34ms  1.01     33.8±0.06ms
tree-hash block-6fe59b24-compressed                          1.00     33.2±0.47ms  1.01     33.5±0.34ms
tree-hash block-834752                                       1.00      2.1±0.21ms  1.00      2.1±0.01ms
tree-hash block-834752-compressed                            1.00      2.1±0.01ms  1.00      2.1±0.00ms
tree-hash block-b45268ac                                     1.00     30.2±0.27ms  1.03     31.2±1.68ms
tree-hash block-b45268ac-compressed                          1.00     30.6±0.04ms  1.00     30.7±0.04ms
tree-hash block-c2a8df0d                                     1.00     35.4±0.07ms  1.02     36.2±0.12ms
tree-hash block-c2a8df0d-compressed                          1.01     36.2±0.85ms  1.00     35.7±0.50ms
tree-hash-from-stream block-1ee588dc                         1.00     31.3±0.08ms  1.02     32.0±0.39ms
tree-hash-from-stream block-1ee588dc-compressed              1.05      6.0±0.09ms  1.00      5.7±0.09ms
tree-hash-from-stream block-225758                           1.12   153.6±88.04µs  1.00    137.5±0.71µs
tree-hash-from-stream block-225758-compressed                1.01    121.2±0.99µs  1.00    120.4±0.92µs
tree-hash-from-stream block-4671894                          1.00      6.4±0.03ms  1.01      6.4±0.01ms
tree-hash-from-stream block-4671894-compressed               1.01      4.8±0.05ms  1.00      4.7±0.16ms
tree-hash-from-stream block-6fe59b24                         1.00     33.9±0.19ms  1.01     34.4±0.34ms
tree-hash-from-stream block-6fe59b24-compressed              1.02      7.0±0.03ms  1.00      6.9±0.07ms
tree-hash-from-stream block-834752                           1.00      2.1±0.03ms  1.01      2.1±0.02ms
tree-hash-from-stream block-834752-compressed                1.06    511.1±9.85µs  1.00    480.9±3.50µs
tree-hash-from-stream block-b45268ac                         1.00     31.1±0.86ms  1.01     31.5±0.24ms
tree-hash-from-stream block-b45268ac-compressed              1.04      5.7±0.04ms  1.00      5.5±0.02ms
tree-hash-from-stream block-c2a8df0d                         1.00     36.5±0.38ms  1.02     37.3±0.16ms
tree-hash-from-stream block-c2a8df0d-compressed              1.05      5.9±0.03ms  1.00      5.6±0.05ms

@arvidn arvidn changed the title Introduce reference counters for atoms and pairs in Allocator [CHIA-3002] Introduce reference counters for atoms and pairs in Allocator Jun 11, 2025
@coveralls-official

coveralls-official Bot commented Jun 11, 2025

Copy link
Copy Markdown

Pull Request Test Coverage Report for Build 15736984774

Details

  • 76 of 77 (98.7%) changed or added relevant lines in 5 files are covered.
  • 6 unchanged lines in 1 file lost coverage.
  • Overall coverage decreased (-0.06%) to 94.309%

Changes Missing Coverage Covered Lines Changed/Added Lines %
src/allocator.rs 70 71 98.59%
Files with Coverage Reduction New Missed Lines %
src/allocator.rs 6 97.56%
Totals Coverage Status
Change from base Build 15735823438: -0.06%
Covered Lines: 7027
Relevant Lines: 7451

💛 - Coveralls

@arvidn
arvidn requested review from Rigidity and richardkiss June 12, 2025 13:43
@arvidn
arvidn marked this pull request as ready for review June 12, 2025 13:43
Rigidity
Rigidity previously approved these changes Jun 12, 2025
@arvidn

arvidn commented Jun 17, 2025

Copy link
Copy Markdown
Contributor Author

I updated this to not keep reference counts for atoms, since it doesn't seem to be worth memoizing anyway

@arvidn
arvidn requested a review from Rigidity June 17, 2025 15:37
Rigidity
Rigidity previously approved these changes Jun 17, 2025
…work as

substitutes for node_from_bytes_backrefs_record(), which records which nodes are
referenced more than once in deserialization. These are used for memoization in
tree_hash_cached(). Using reference counters in the Allocator allows memoization
of structures generated programmatically as well.
Rigidity
Rigidity previously approved these changes Jun 18, 2025
@arvidn

arvidn commented Jun 19, 2025

Copy link
Copy Markdown
Contributor Author

closed in favor of #589

@arvidn arvidn closed this Jun 19, 2025
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