Skip to content

Reduce memory usage in component fetches and change detection filters#15283

Merged
alice-i-cecile merged 4 commits into
bevyengine:mainfrom
ItsDoot:fetchmemoryusage
Sep 27, 2024
Merged

Reduce memory usage in component fetches and change detection filters#15283
alice-i-cecile merged 4 commits into
bevyengine:mainfrom
ItsDoot:fetchmemoryusage

Conversation

@ItsDoot

@ItsDoot ItsDoot commented Sep 18, 2024

Copy link
Copy Markdown
Contributor

Objective

Solution

Same as #6396, we use a compile-time checked StorageSwitch union type to select the fetch data based on the component's storage type, saving >= 8 bytes per component fetch in a given query.

Note: We forego the Query iteration change as it exists in a slightly different form now on main.

Testing

  • All current tests pass locally.

Co-authored-by: james7132 <contact@jamessliu.com>
@ItsDoot ItsDoot added A-ECS Entities, components, systems, and events C-Performance A change motivated by improving speed, memory usage or compile times S-Needs-Review Needs reviewer attention (from anyone!) to move forward D-Unsafe Touches with unsafe code in some way labels Sep 18, 2024
@ItsDoot

ItsDoot commented Sep 18, 2024

Copy link
Copy Markdown
Contributor Author
Full ECS benchmark suite results (this PR on left)
group                                               fetchmemoryusage                        main
-----                                               ----------------                        ----
add_remove/sparse_set                               1.00   522.5±14.11µs        ? ?/sec     1.02   535.2±22.67µs        ? ?/sec
add_remove/table                                    1.00   684.9±44.74µs        ? ?/sec     1.01   694.1±29.81µs        ? ?/sec
add_remove_big/sparse_set                           1.09   624.0±82.72µs        ? ?/sec     1.00   570.9±18.65µs        ? ?/sec
add_remove_big/table                                1.00  1465.8±327.30µs        ? ?/sec    1.02  1490.0±346.44µs        ? ?/sec
add_remove_very_big/table                           1.00     41.6±1.92ms        ? ?/sec     1.02     42.3±1.70ms        ? ?/sec
added_archetypes/archetype_count/100                1.00     35.4±2.17µs        ? ?/sec     1.00     35.5±1.70µs        ? ?/sec
added_archetypes/archetype_count/1000               1.00   413.0±14.66µs        ? ?/sec     1.03   424.7±14.67µs        ? ?/sec
added_archetypes/archetype_count/10000              1.00      7.4±0.95ms        ? ?/sec     1.16      8.6±0.79ms        ? ?/sec
added_archetypes/archetype_count/200                1.03     70.7±4.52µs        ? ?/sec     1.00     68.6±2.79µs        ? ?/sec
added_archetypes/archetype_count/2000               1.00   873.2±35.53µs        ? ?/sec     1.01   885.2±44.41µs        ? ?/sec
added_archetypes/archetype_count/500                1.00   196.9±12.56µs        ? ?/sec     1.01    199.7±9.64µs        ? ?/sec
added_archetypes/archetype_count/5000               1.00      2.7±0.35ms        ? ?/sec     1.00      2.7±0.26ms        ? ?/sec
build_schedule/1000_schedule                        1.05       2.5±0.10s        ? ?/sec     1.00       2.4±0.04s        ? ?/sec
build_schedule/1000_schedule_noconstraints          1.00     22.9±0.59ms        ? ?/sec     1.02     23.3±0.75ms        ? ?/sec
build_schedule/100_schedule                         1.00     10.7±0.18ms        ? ?/sec     1.00     10.8±0.23ms        ? ?/sec
build_schedule/100_schedule_noconstraints           1.00   379.3±14.46µs        ? ?/sec     1.00   378.6±13.71µs        ? ?/sec
build_schedule/500_schedule                         1.00   431.7±11.93ms        ? ?/sec     1.00   433.6±11.29ms        ? ?/sec
build_schedule/500_schedule_noconstraints           1.00      6.1±0.15ms        ? ?/sec     1.00      6.1±0.15ms        ? ?/sec
busy_systems/01x_entities_03_systems                1.00     23.7±0.90µs        ? ?/sec     1.02     24.1±0.71µs        ? ?/sec
busy_systems/01x_entities_06_systems                1.00     39.3±1.37µs        ? ?/sec     1.04     40.8±1.80µs        ? ?/sec
busy_systems/01x_entities_09_systems                1.00     55.1±0.99µs        ? ?/sec     1.02     56.1±2.26µs        ? ?/sec
busy_systems/01x_entities_12_systems                1.00     69.5±1.97µs        ? ?/sec     1.00     69.7±1.39µs        ? ?/sec
busy_systems/01x_entities_15_systems                1.00     83.1±1.87µs        ? ?/sec     1.01     84.2±3.14µs        ? ?/sec
busy_systems/02x_entities_03_systems                1.00     37.0±1.43µs        ? ?/sec     1.55     57.5±1.51µs        ? ?/sec
busy_systems/02x_entities_06_systems                1.00     64.5±1.65µs        ? ?/sec     1.63    105.0±1.79µs        ? ?/sec
busy_systems/02x_entities_09_systems                1.00     90.7±2.20µs        ? ?/sec     1.66    150.6±2.83µs        ? ?/sec
busy_systems/02x_entities_12_systems                1.00    118.7±4.54µs        ? ?/sec     1.65    195.6±3.13µs        ? ?/sec
busy_systems/02x_entities_15_systems                1.00    144.2±3.04µs        ? ?/sec     1.67    241.3±4.29µs        ? ?/sec
busy_systems/03x_entities_03_systems                1.38     67.3±2.03µs        ? ?/sec     1.00     48.6±1.58µs        ? ?/sec
busy_systems/03x_entities_06_systems                1.39    122.5±2.27µs        ? ?/sec     1.00     87.9±3.18µs        ? ?/sec
busy_systems/03x_entities_09_systems                1.42    176.3±2.42µs        ? ?/sec     1.00    124.6±2.26µs        ? ?/sec
busy_systems/03x_entities_12_systems                1.42    231.4±3.20µs        ? ?/sec     1.00    162.4±2.67µs        ? ?/sec
busy_systems/03x_entities_15_systems                1.42    284.8±4.39µs        ? ?/sec     1.00    200.3±5.10µs        ? ?/sec
busy_systems/04x_entities_03_systems                1.69    102.1±2.15µs        ? ?/sec     1.00     60.6±1.19µs        ? ?/sec
busy_systems/04x_entities_06_systems                1.72    189.7±3.55µs        ? ?/sec     1.00    110.2±1.59µs        ? ?/sec
busy_systems/04x_entities_09_systems                1.74    278.0±6.33µs        ? ?/sec     1.00    160.2±2.46µs        ? ?/sec
busy_systems/04x_entities_12_systems                1.74    363.7±5.83µs        ? ?/sec     1.00    209.0±5.32µs        ? ?/sec
busy_systems/04x_entities_15_systems                1.76    454.9±9.44µs        ? ?/sec     1.00    258.4±3.94µs        ? ?/sec
busy_systems/05x_entities_03_systems                1.04     77.2±2.50µs        ? ?/sec     1.00     74.1±1.90µs        ? ?/sec
busy_systems/05x_entities_06_systems                1.04    141.8±2.17µs        ? ?/sec     1.00    136.4±4.58µs        ? ?/sec
busy_systems/05x_entities_09_systems                1.04    205.0±2.86µs        ? ?/sec     1.00    196.6±4.42µs        ? ?/sec
busy_systems/05x_entities_12_systems                1.05    266.6±3.12µs        ? ?/sec     1.00    254.5±2.79µs        ? ?/sec
busy_systems/05x_entities_15_systems                1.04    330.5±4.96µs        ? ?/sec     1.00    316.5±6.31µs        ? ?/sec
contrived/01x_entities_03_systems                   1.00     10.6±0.58µs        ? ?/sec     1.02     10.7±0.59µs        ? ?/sec
contrived/01x_entities_06_systems                   1.00     19.9±0.77µs        ? ?/sec     1.03     20.5±0.71µs        ? ?/sec
contrived/01x_entities_09_systems                   1.00     27.8±0.68µs        ? ?/sec     1.03     28.6±1.23µs        ? ?/sec
contrived/01x_entities_12_systems                   1.00     36.4±1.30µs        ? ?/sec     1.01     36.7±1.45µs        ? ?/sec
contrived/01x_entities_15_systems                   1.00     43.9±1.77µs        ? ?/sec     1.04     45.6±4.74µs        ? ?/sec
contrived/02x_entities_03_systems                   1.00     19.8±0.57µs        ? ?/sec     1.24     24.7±0.61µs        ? ?/sec
contrived/02x_entities_06_systems                   1.00     33.4±1.00µs        ? ?/sec     1.30     43.5±1.86µs        ? ?/sec
contrived/02x_entities_09_systems                   1.00     48.5±1.03µs        ? ?/sec     1.23     59.6±0.99µs        ? ?/sec
contrived/02x_entities_12_systems                   1.00     63.5±1.96µs        ? ?/sec     1.20     76.0±1.70µs        ? ?/sec
contrived/02x_entities_15_systems                   1.00     76.7±1.92µs        ? ?/sec     1.22     93.2±2.06µs        ? ?/sec
contrived/03x_entities_03_systems                   1.00     25.0±0.75µs        ? ?/sec     1.03     25.8±0.97µs        ? ?/sec
contrived/03x_entities_06_systems                   1.00     46.8±1.37µs        ? ?/sec     1.02     47.5±1.35µs        ? ?/sec
contrived/03x_entities_09_systems                   1.00     67.6±1.09µs        ? ?/sec     1.03     69.4±1.43µs        ? ?/sec
contrived/03x_entities_12_systems                   1.00     88.0±2.58µs        ? ?/sec     1.02     89.9±2.00µs        ? ?/sec
contrived/03x_entities_15_systems                   1.00    107.9±3.23µs        ? ?/sec     1.03    111.1±6.23µs        ? ?/sec
contrived/04x_entities_03_systems                   1.00     29.7±1.06µs        ? ?/sec     1.07     31.8±2.10µs        ? ?/sec
contrived/04x_entities_06_systems                   1.00     58.3±1.25µs        ? ?/sec     1.03     59.8±1.45µs        ? ?/sec
contrived/04x_entities_09_systems                   1.00     81.9±1.78µs        ? ?/sec     1.02     83.9±2.01µs        ? ?/sec
contrived/04x_entities_12_systems                   1.00    106.0±1.54µs        ? ?/sec     1.04    110.4±3.43µs        ? ?/sec
contrived/04x_entities_15_systems                   1.00    130.8±2.54µs        ? ?/sec     1.04    136.5±4.89µs        ? ?/sec
contrived/05x_entities_03_systems                   1.00     34.5±1.34µs        ? ?/sec     1.39     47.9±1.56µs        ? ?/sec
contrived/05x_entities_06_systems                   1.00     68.2±1.55µs        ? ?/sec     1.26     85.6±1.50µs        ? ?/sec
contrived/05x_entities_09_systems                   1.00     96.1±1.95µs        ? ?/sec     1.28    123.3±1.76µs        ? ?/sec
contrived/05x_entities_12_systems                   1.00    126.3±2.53µs        ? ?/sec     1.27    159.9±2.86µs        ? ?/sec
contrived/05x_entities_15_systems                   1.00    156.0±3.95µs        ? ?/sec     1.25    195.7±7.00µs        ? ?/sec
empty_commands/0_entities                           1.00      6.5±0.24ns        ? ?/sec     1.05      6.8±0.29ns        ? ?/sec
empty_systems/000_systems                           1.00      5.2±0.18ns        ? ?/sec     1.02      5.3±0.40ns        ? ?/sec
empty_systems/001_systems                           1.00  1300.3±65.36ns        ? ?/sec     1.02  1323.6±86.09ns        ? ?/sec
empty_systems/002_systems                           1.00      2.5±0.19µs        ? ?/sec     1.01      2.5±0.17µs        ? ?/sec
empty_systems/003_systems                           1.02      4.5±0.59µs        ? ?/sec     1.00      4.4±0.19µs        ? ?/sec
empty_systems/004_systems                           1.00      4.5±0.25µs        ? ?/sec     1.05      4.7±0.30µs        ? ?/sec
empty_systems/005_systems                           1.00      4.6±0.26µs        ? ?/sec     1.03      4.7±0.23µs        ? ?/sec
empty_systems/010_systems                           1.00      5.8±0.18µs        ? ?/sec     1.05      6.1±0.39µs        ? ?/sec
empty_systems/015_systems                           1.00      6.5±0.34µs        ? ?/sec     1.02      6.7±0.36µs        ? ?/sec
empty_systems/020_systems                           1.00      8.1±0.34µs        ? ?/sec     1.02      8.3±0.26µs        ? ?/sec
empty_systems/025_systems                           1.00      9.7±0.28µs        ? ?/sec     1.05     10.1±0.46µs        ? ?/sec
empty_systems/030_systems                           1.00     11.7±0.47µs        ? ?/sec     1.01     11.8±0.32µs        ? ?/sec
empty_systems/035_systems                           1.00     12.9±0.47µs        ? ?/sec     1.06     13.6±0.48µs        ? ?/sec
empty_systems/040_systems                           1.00     14.8±0.43µs        ? ?/sec     1.00     14.7±0.45µs        ? ?/sec
empty_systems/045_systems                           1.00     16.2±0.41µs        ? ?/sec     1.04     16.8±0.85µs        ? ?/sec
empty_systems/050_systems                           1.00     18.1±0.90µs        ? ?/sec     1.03     18.6±0.67µs        ? ?/sec
empty_systems/055_systems                           1.00     19.2±0.37µs        ? ?/sec     1.10     21.2±1.79µs        ? ?/sec
empty_systems/060_systems                           1.00     20.5±0.34µs        ? ?/sec     1.03     21.1±0.59µs        ? ?/sec
empty_systems/065_systems                           1.00     22.4±0.56µs        ? ?/sec     1.04     23.4±1.02µs        ? ?/sec
empty_systems/070_systems                           1.00     24.0±0.59µs        ? ?/sec     1.04     24.9±1.56µs        ? ?/sec
empty_systems/075_systems                           1.00     25.7±1.23µs        ? ?/sec     1.02     26.3±0.69µs        ? ?/sec
empty_systems/080_systems                           1.00     27.4±0.73µs        ? ?/sec     1.02     28.0±0.68µs        ? ?/sec
empty_systems/085_systems                           1.00     29.4±0.69µs        ? ?/sec     1.01     29.9±1.40µs        ? ?/sec
empty_systems/090_systems                           1.00     31.2±0.69µs        ? ?/sec     1.02     31.8±0.90µs        ? ?/sec
empty_systems/095_systems                           1.00     34.4±1.05µs        ? ?/sec     1.02     34.9±0.97µs        ? ?/sec
empty_systems/100_systems                           1.00     35.5±1.03µs        ? ?/sec     1.04     36.8±1.56µs        ? ?/sec
entity_hash/entity_set_build/100                    1.00   590.7±31.63ns 161.5 MElem/sec    1.01   595.9±19.02ns 160.0 MElem/sec
entity_hash/entity_set_build/1000                   1.00      3.8±0.48µs 251.0 MElem/sec    1.00      3.8±0.42µs 251.8 MElem/sec
entity_hash/entity_set_build/10000                  1.00     36.6±2.21µs 260.7 MElem/sec    1.04     38.2±3.63µs 249.9 MElem/sec
entity_hash/entity_set_build/316                    1.00  1457.2±36.91ns 206.8 MElem/sec    1.07  1560.0±76.80ns 193.2 MElem/sec
entity_hash/entity_set_build/3162                   1.00     11.2±0.74µs 269.1 MElem/sec    1.00     11.2±0.64µs 268.5 MElem/sec
entity_hash/entity_set_lookup_hit/100               1.00    141.8±4.18ns 672.4 MElem/sec    1.05   148.4±10.59ns 642.5 MElem/sec
entity_hash/entity_set_lookup_hit/1000              1.00  1524.8±65.84ns 625.4 MElem/sec    1.01  1543.4±127.68ns 617.9 MElem/sec
entity_hash/entity_set_lookup_hit/10000             1.00     18.1±0.64µs 527.9 MElem/sec    1.00     18.1±0.88µs 528.0 MElem/sec
entity_hash/entity_set_lookup_hit/316               1.02   498.5±19.68ns 604.5 MElem/sec    1.00   488.3±21.60ns 617.1 MElem/sec
entity_hash/entity_set_lookup_hit/3162              1.03      5.1±0.29µs 588.1 MElem/sec    1.00      5.0±0.18µs 604.6 MElem/sec
entity_hash/entity_set_lookup_miss_gen/100          1.00    224.8±4.97ns 424.2 MElem/sec    1.06   239.2±11.77ns 398.7 MElem/sec
entity_hash/entity_set_lookup_miss_gen/1000         1.00      2.2±0.12µs 425.6 MElem/sec    1.00      2.2±0.06µs 424.6 MElem/sec
entity_hash/entity_set_lookup_miss_gen/10000        1.02     27.8±1.19µs 343.6 MElem/sec    1.00     27.1±0.67µs 351.3 MElem/sec
entity_hash/entity_set_lookup_miss_gen/316          1.00   812.6±20.65ns 370.9 MElem/sec    1.02   829.6±21.20ns 363.3 MElem/sec
entity_hash/entity_set_lookup_miss_gen/3162         1.00     10.0±0.28µs 300.5 MElem/sec    1.00     10.0±0.23µs 300.9 MElem/sec
entity_hash/entity_set_lookup_miss_id/100           1.00    134.7±2.62ns 707.9 MElem/sec    1.04    140.2±6.30ns 680.0 MElem/sec
entity_hash/entity_set_lookup_miss_id/1000          1.00  1374.6±83.92ns 693.8 MElem/sec    1.05  1438.6±67.58ns 662.9 MElem/sec
entity_hash/entity_set_lookup_miss_id/10000         1.00     16.5±0.55µs 578.5 MElem/sec    1.11     18.3±1.62µs 522.3 MElem/sec
entity_hash/entity_set_lookup_miss_id/316           1.00   517.0±16.65ns 582.9 MElem/sec    1.05   545.3±18.97ns 552.7 MElem/sec
entity_hash/entity_set_lookup_miss_id/3162          1.00      7.2±0.22µs 419.4 MElem/sec    1.21      8.7±0.23µs 345.2 MElem/sec
event_propagation/four_event_types                  1.00   370.6±11.03µs        ? ?/sec     1.03   381.8±11.30µs        ? ?/sec
event_propagation/single_event_type                 1.00   513.1±29.33µs        ? ?/sec     1.01   516.3±20.70µs        ? ?/sec
event_propagation/single_event_type_no_listeners    1.00    244.0±4.93µs        ? ?/sec     1.07   261.2±46.60µs        ? ?/sec
events_iter/size_16_events_100                      1.41     75.9±4.95ns        ? ?/sec     1.00     53.8±3.90ns        ? ?/sec
events_iter/size_16_events_1000                     1.06   473.6±16.99ns        ? ?/sec     1.00   446.2±19.26ns        ? ?/sec
events_iter/size_16_events_10000                    1.00      4.4±0.12µs        ? ?/sec     1.00      4.4±0.14µs        ? ?/sec
events_iter/size_16_events_50000                    1.01     22.1±1.48µs        ? ?/sec     1.00     21.9±0.59µs        ? ?/sec
events_iter/size_4_events_100                       1.38     74.8±3.92ns        ? ?/sec     1.00     54.2±3.98ns        ? ?/sec
events_iter/size_4_events_1000                      1.05   472.5±17.30ns        ? ?/sec     1.00   448.6±20.49ns        ? ?/sec
events_iter/size_4_events_10000                     1.03      4.5±0.28µs        ? ?/sec     1.00      4.4±0.20µs        ? ?/sec
events_iter/size_4_events_50000                     1.02     22.2±1.39µs        ? ?/sec     1.00     21.9±0.68µs        ? ?/sec
events_iter/size_512_events_100                     1.00     54.1±3.10ns        ? ?/sec     1.45     78.3±6.45ns        ? ?/sec
events_iter/size_512_events_1000                    1.00    438.2±9.10ns        ? ?/sec     1.09   477.0±14.13ns        ? ?/sec
events_iter/size_512_events_10000                   1.00      4.4±0.16µs        ? ?/sec     1.04      4.6±0.22µs        ? ?/sec
events_iter/size_512_events_50000                   1.00     22.6±0.59µs        ? ?/sec     1.04     23.6±1.74µs        ? ?/sec
events_send/size_16_events_100                      1.00    109.1±6.07ns        ? ?/sec     1.14   124.6±10.93ns        ? ?/sec
events_send/size_16_events_1000                     1.00   983.7±22.44ns        ? ?/sec     1.05  1029.7±30.20ns        ? ?/sec
events_send/size_16_events_10000                    1.00      9.2±0.30µs        ? ?/sec     1.17     10.7±1.16µs        ? ?/sec
events_send/size_16_events_50000                    1.00     46.3±1.44µs        ? ?/sec     1.14     53.0±2.98µs        ? ?/sec
events_send/size_4_events_100                       1.01     95.4±5.87ns        ? ?/sec     1.00     94.8±4.08ns        ? ?/sec
events_send/size_4_events_1000                      1.00   816.7±30.54ns        ? ?/sec     1.12   911.3±36.70ns        ? ?/sec
events_send/size_4_events_10000                     1.00      8.3±0.41µs        ? ?/sec     1.13      9.3±0.37µs        ? ?/sec
events_send/size_4_events_50000                     1.00     41.7±4.21µs        ? ?/sec     1.09     45.6±1.54µs        ? ?/sec
events_send/size_512_events_100                     1.09  1349.3±40.70ns        ? ?/sec     1.00  1233.8±31.22ns        ? ?/sec
events_send/size_512_events_1000                    1.08     13.7±0.31µs        ? ?/sec     1.00     12.7±0.54µs        ? ?/sec
events_send/size_512_events_10000                   1.08    138.9±3.97µs        ? ?/sec     1.00    128.6±6.90µs        ? ?/sec
events_send/size_512_events_50000                   1.06   754.1±55.42µs        ? ?/sec     1.00   713.2±85.11µs        ? ?/sec
fake_commands/2000_commands                         1.00     10.8±0.61µs        ? ?/sec     1.01     10.9±0.63µs        ? ?/sec
fake_commands/4000_commands                         1.00     21.4±0.92µs        ? ?/sec     1.01     21.7±0.76µs        ? ?/sec
fake_commands/6000_commands                         1.00     32.0±1.01µs        ? ?/sec     1.02     32.8±2.35µs        ? ?/sec
fake_commands/8000_commands                         1.00     42.9±1.91µs        ? ?/sec     1.00     43.0±1.53µs        ? ?/sec
get_or_spawn/batched                                1.00   228.7±18.12µs        ? ?/sec     1.01   231.5±22.81µs        ? ?/sec
get_or_spawn/individual                             1.02   507.5±72.34µs        ? ?/sec     1.00   496.8±67.83µs        ? ?/sec
heavy_compute/base                                  1.00    177.4±4.42µs        ? ?/sec     1.00    177.1±6.18µs        ? ?/sec
insert_commands/insert                              1.00   364.1±44.48µs        ? ?/sec     1.00   365.5±35.60µs        ? ?/sec
insert_commands/insert_batch                        1.02   234.9±12.40µs        ? ?/sec     1.00   230.4±14.97µs        ? ?/sec
insert_simple/base                                  1.03    233.2±8.29µs        ? ?/sec     1.00    226.2±7.87µs        ? ?/sec
insert_simple/unbatched                             1.00   527.0±19.58µs        ? ?/sec     1.01   534.2±21.90µs        ? ?/sec
iter_fragmented(4096)_empty/foreach_sparse          1.00      7.1±0.24µs        ? ?/sec     1.03      7.3±0.43µs        ? ?/sec
iter_fragmented(4096)_empty/foreach_table           1.00      2.3±0.08µs        ? ?/sec     1.00      2.3±0.10µs        ? ?/sec
iter_fragmented/base                                1.00   267.8±15.07ns        ? ?/sec     1.36   363.2±22.20ns        ? ?/sec
iter_fragmented/foreach                             1.02   132.8±21.65ns        ? ?/sec     1.00   129.8±14.80ns        ? ?/sec
iter_fragmented/foreach_wide                        1.00      3.2±0.16µs        ? ?/sec     1.07      3.4±0.12µs        ? ?/sec
iter_fragmented/wide                                1.00      3.0±0.17µs        ? ?/sec     1.00      3.0±0.17µs        ? ?/sec
iter_fragmented_sparse/base                         1.07      7.0±0.87ns        ? ?/sec     1.00      6.6±0.40ns        ? ?/sec
iter_fragmented_sparse/foreach                      1.00      7.0±0.39ns        ? ?/sec     1.00      7.0±0.23ns        ? ?/sec
iter_fragmented_sparse/foreach_wide                 1.00     31.4±3.43ns        ? ?/sec     1.57     49.4±2.47ns        ? ?/sec
iter_fragmented_sparse/wide                         1.03     35.0±8.09ns        ? ?/sec     1.00     33.9±1.88ns        ? ?/sec
iter_simple/base                                    1.00      6.5±0.41µs        ? ?/sec     1.01      6.6±0.20µs        ? ?/sec
iter_simple/foreach                                 1.00      6.0±0.38µs        ? ?/sec     1.06      6.3±0.53µs        ? ?/sec
iter_simple/foreach_hybrid                          1.00      8.1±0.25µs        ? ?/sec     1.06      8.7±0.39µs        ? ?/sec
iter_simple/foreach_sparse_set                      1.02     17.2±0.59µs        ? ?/sec     1.00     16.8±0.94µs        ? ?/sec
iter_simple/foreach_wide                            1.00     28.7±1.06µs        ? ?/sec     1.03     29.7±1.48µs        ? ?/sec
iter_simple/foreach_wide_sparse_set                 1.00     89.6±2.44µs        ? ?/sec     1.29    115.8±3.33µs        ? ?/sec
iter_simple/sparse_set                              1.04     17.9±0.47µs        ? ?/sec     1.00     17.3±0.53µs        ? ?/sec
iter_simple/system                                  1.00      6.4±0.18µs        ? ?/sec     1.27      8.2±0.28µs        ? ?/sec
iter_simple/wide                                    1.00     39.3±1.58µs        ? ?/sec     1.03     40.6±2.72µs        ? ?/sec
iter_simple/wide_sparse_set                         1.00     97.7±2.36µs        ? ?/sec     1.13    110.6±3.85µs        ? ?/sec
no_archetypes/system_count/0                        1.02      8.5±0.44ns        ? ?/sec     1.00      8.3±0.22ns        ? ?/sec
no_archetypes/system_count/100                      1.03  1027.1±62.41ns        ? ?/sec     1.00   998.8±33.25ns        ? ?/sec
no_archetypes/system_count/20                       1.00    197.7±5.09ns        ? ?/sec     1.00    198.6±6.53ns        ? ?/sec
no_archetypes/system_count/40                       1.05   408.7±16.56ns        ? ?/sec     1.00   389.8±15.28ns        ? ?/sec
no_archetypes/system_count/60                       1.01   582.9±31.56ns        ? ?/sec     1.00   579.4±24.92ns        ? ?/sec
no_archetypes/system_count/80                       1.00   837.2±75.76ns        ? ?/sec     1.01   845.5±46.53ns        ? ?/sec
observe/trigger_simple                              1.00     51.2±2.38µs        ? ?/sec     1.05     53.8±2.33µs        ? ?/sec
observe/trigger_targets_simple/10000_entity         1.00   756.3±68.48µs        ? ?/sec     1.05   791.7±78.93µs        ? ?/sec
par_iter_simple/hybrid                              1.00     58.3±2.52µs        ? ?/sec     1.03     60.2±9.06µs        ? ?/sec
par_iter_simple/with_0_fragment                     1.00     29.5±2.30µs        ? ?/sec     1.00     29.5±1.48µs        ? ?/sec
par_iter_simple/with_1000_fragment                  1.00     34.8±2.44µs        ? ?/sec     1.04     36.0±1.87µs        ? ?/sec
par_iter_simple/with_100_fragment                   1.00     28.3±2.17µs        ? ?/sec     1.04     29.4±1.51µs        ? ?/sec
par_iter_simple/with_10_fragment                    1.00     29.2±1.58µs        ? ?/sec     1.01     29.4±1.32µs        ? ?/sec
query_get/50000_entities_sparse                     1.00    211.5±6.30µs        ? ?/sec     1.02    214.9±7.14µs        ? ?/sec
query_get/50000_entities_table                      1.00   192.4±11.11µs        ? ?/sec     1.03   197.8±10.73µs        ? ?/sec
query_get_many_10/50000_calls_sparse                1.00  1816.1±235.79µs        ? ?/sec    1.06  1929.0±331.96µs        ? ?/sec
query_get_many_10/50000_calls_table                 1.00  1868.3±127.12µs        ? ?/sec    1.02  1911.9±135.63µs        ? ?/sec
query_get_many_2/50000_calls_sparse                 1.00   389.0±45.46µs        ? ?/sec     1.04   402.7±48.53µs        ? ?/sec
query_get_many_2/50000_calls_table                  1.00   439.7±62.58µs        ? ?/sec     1.03   453.3±66.63µs        ? ?/sec
query_get_many_5/50000_calls_sparse                 1.00   912.4±98.49µs        ? ?/sec     1.04  946.4±122.60µs        ? ?/sec
query_get_many_5/50000_calls_table                  1.00  1059.4±97.88µs        ? ?/sec     1.03  1091.8±109.33µs        ? ?/sec
run_condition/no/001_systems                        1.00     98.1±4.08ns        ? ?/sec     1.00     97.7±4.78ns        ? ?/sec
run_condition/no/006_systems                        1.00   325.3±10.73ns        ? ?/sec     1.01   328.2±19.54ns        ? ?/sec
run_condition/no/011_systems                        1.00   562.6±17.65ns        ? ?/sec     1.00   565.3±28.97ns        ? ?/sec
run_condition/no/016_systems                        1.00   790.8±35.52ns        ? ?/sec     1.02   807.0±43.21ns        ? ?/sec
run_condition/no/021_systems                        1.00  1037.2±33.90ns        ? ?/sec     1.00  1036.2±62.98ns        ? ?/sec
run_condition/no/026_systems                        1.00  1281.3±51.36ns        ? ?/sec     1.01  1287.9±74.26ns        ? ?/sec
run_condition/no/031_systems                        1.00  1515.4±76.17ns        ? ?/sec     1.02  1550.0±69.73ns        ? ?/sec
run_condition/no/036_systems                        1.00  1806.6±66.80ns        ? ?/sec     1.00  1798.2±108.82ns        ? ?/sec
run_condition/no/041_systems                        1.00      2.1±0.15µs        ? ?/sec     1.02      2.1±0.26µs        ? ?/sec
run_condition/no/046_systems                        1.00      2.2±0.08µs        ? ?/sec     1.02      2.3±0.11µs        ? ?/sec
run_condition/no/051_systems                        1.00      2.5±0.17µs        ? ?/sec     1.01      2.5±0.12µs        ? ?/sec
run_condition/no/056_systems                        1.00      2.7±0.08µs        ? ?/sec     1.00      2.7±0.11µs        ? ?/sec
run_condition/no/061_systems                        1.00      3.0±0.09µs        ? ?/sec     1.01      3.0±0.12µs        ? ?/sec
run_condition/no/066_systems                        1.05      3.4±0.16µs        ? ?/sec     1.00      3.2±0.13µs        ? ?/sec
run_condition/no/071_systems                        1.00      3.5±0.45µs        ? ?/sec     1.00      3.5±0.16µs        ? ?/sec
run_condition/no/076_systems                        1.00      3.7±0.22µs        ? ?/sec     1.01      3.8±0.23µs        ? ?/sec
run_condition/no/081_systems                        1.00      4.0±0.19µs        ? ?/sec     1.01      4.0±0.29µs        ? ?/sec
run_condition/no/086_systems                        1.00      4.2±0.14µs        ? ?/sec     1.01      4.2±0.24µs        ? ?/sec
run_condition/no/091_systems                        1.00      4.5±0.18µs        ? ?/sec     1.02      4.5±0.35µs        ? ?/sec
run_condition/no/096_systems                        1.00      4.6±0.14µs        ? ?/sec     1.01      4.7±0.23µs        ? ?/sec
run_condition/no/101_systems                        1.00      4.9±0.33µs        ? ?/sec     1.00      4.9±0.26µs        ? ?/sec
run_condition/yes/001_systems                       1.00  1518.5±69.35ns        ? ?/sec     1.01  1535.8±116.00ns        ? ?/sec
run_condition/yes/006_systems                       1.00      5.1±0.30µs        ? ?/sec     1.06      5.5±0.32µs        ? ?/sec
run_condition/yes/011_systems                       1.00      5.9±0.32µs        ? ?/sec     1.01      6.0±0.21µs        ? ?/sec
run_condition/yes/016_systems                       1.00      6.7±0.23µs        ? ?/sec     1.05      7.0±0.38µs        ? ?/sec
run_condition/yes/021_systems                       1.00      8.2±0.26µs        ? ?/sec     1.02      8.4±0.22µs        ? ?/sec
run_condition/yes/026_systems                       1.00     10.5±1.08µs        ? ?/sec     1.00     10.4±0.31µs        ? ?/sec
run_condition/yes/031_systems                       1.00     12.0±0.45µs        ? ?/sec     1.01     12.1±0.46µs        ? ?/sec
run_condition/yes/036_systems                       1.00     13.2±0.36µs        ? ?/sec     1.02     13.5±0.41µs        ? ?/sec
run_condition/yes/041_systems                       1.00     14.7±0.37µs        ? ?/sec     1.05     15.4±0.85µs        ? ?/sec
run_condition/yes/046_systems                       1.00     16.4±0.51µs        ? ?/sec     1.01     16.6±0.42µs        ? ?/sec
run_condition/yes/051_systems                       1.00     18.4±0.69µs        ? ?/sec     1.00     18.3±0.60µs        ? ?/sec
run_condition/yes/056_systems                       1.00     19.3±0.66µs        ? ?/sec     1.02     19.7±1.05µs        ? ?/sec
run_condition/yes/061_systems                       1.00     20.8±0.59µs        ? ?/sec     1.03     21.5±0.68µs        ? ?/sec
run_condition/yes/066_systems                       1.00     22.5±0.66µs        ? ?/sec     1.04     23.4±1.15µs        ? ?/sec
run_condition/yes/071_systems                       1.00     25.0±0.88µs        ? ?/sec     1.00     24.9±0.87µs        ? ?/sec
run_condition/yes/076_systems                       1.00     26.0±0.88µs        ? ?/sec     1.03     26.8±0.98µs        ? ?/sec
run_condition/yes/081_systems                       1.00     28.3±1.61µs        ? ?/sec     1.01     28.7±0.88µs        ? ?/sec
run_condition/yes/086_systems                       1.00     30.0±0.74µs        ? ?/sec     1.03     30.8±2.38µs        ? ?/sec
run_condition/yes/091_systems                       1.00     31.8±0.78µs        ? ?/sec     1.02     32.4±1.04µs        ? ?/sec
run_condition/yes/096_systems                       1.00     34.9±0.95µs        ? ?/sec     1.07     37.3±2.47µs        ? ?/sec
run_condition/yes/101_systems                       1.00     35.9±0.93µs        ? ?/sec     1.04     37.3±2.19µs        ? ?/sec
run_condition/yes_using_query/001_systems           1.00  1515.3±107.07ns        ? ?/sec    1.12  1689.9±97.37ns        ? ?/sec
run_condition/yes_using_query/006_systems           1.00      5.1±0.26µs        ? ?/sec     1.07      5.5±0.50µs        ? ?/sec
run_condition/yes_using_query/011_systems           1.00      5.9±0.22µs        ? ?/sec     1.04      6.1±0.24µs        ? ?/sec
run_condition/yes_using_query/016_systems           1.00      6.6±0.26µs        ? ?/sec     1.03      6.8±0.31µs        ? ?/sec
run_condition/yes_using_query/021_systems           1.00      8.3±0.36µs        ? ?/sec     1.04      8.7±0.34µs        ? ?/sec
run_condition/yes_using_query/026_systems           1.00     10.1±0.37µs        ? ?/sec     1.02     10.3±0.29µs        ? ?/sec
run_condition/yes_using_query/031_systems           1.00     11.9±0.42µs        ? ?/sec     1.01     12.0±0.30µs        ? ?/sec
run_condition/yes_using_query/036_systems           1.00     13.0±0.31µs        ? ?/sec     1.03     13.4±0.39µs        ? ?/sec
run_condition/yes_using_query/041_systems           1.00     15.0±0.79µs        ? ?/sec     1.00     14.9±0.44µs        ? ?/sec
run_condition/yes_using_query/046_systems           1.01     16.7±0.56µs        ? ?/sec     1.00     16.6±0.42µs        ? ?/sec
run_condition/yes_using_query/051_systems           1.00     18.6±0.67µs        ? ?/sec     1.00     18.5±0.44µs        ? ?/sec
run_condition/yes_using_query/056_systems           1.00     19.2±0.69µs        ? ?/sec     1.02     19.6±0.53µs        ? ?/sec
run_condition/yes_using_query/061_systems           1.00     20.7±0.62µs        ? ?/sec     1.02     21.2±0.76µs        ? ?/sec
run_condition/yes_using_query/066_systems           1.00     22.4±0.63µs        ? ?/sec     1.06     23.7±1.16µs        ? ?/sec
run_condition/yes_using_query/071_systems           1.00     24.4±0.69µs        ? ?/sec     1.03     25.2±1.04µs        ? ?/sec
run_condition/yes_using_query/076_systems           1.00     26.4±0.92µs        ? ?/sec     1.02     27.0±1.49µs        ? ?/sec
run_condition/yes_using_query/081_systems           1.00     28.0±0.94µs        ? ?/sec     1.00     27.9±0.75µs        ? ?/sec
run_condition/yes_using_query/086_systems           1.00     30.1±0.71µs        ? ?/sec     1.00     30.1±0.97µs        ? ?/sec
run_condition/yes_using_query/091_systems           1.00     32.0±0.85µs        ? ?/sec     1.04     33.3±2.15µs        ? ?/sec
run_condition/yes_using_query/096_systems           1.00     35.4±1.31µs        ? ?/sec     1.02     36.1±1.23µs        ? ?/sec
run_condition/yes_using_query/101_systems           1.00     36.4±0.90µs        ? ?/sec     1.04     37.8±4.43µs        ? ?/sec
run_condition/yes_using_resource/001_systems        1.11  1613.7±60.69ns        ? ?/sec     1.00  1450.0±102.12ns        ? ?/sec
run_condition/yes_using_resource/006_systems        1.00      5.2±0.54µs        ? ?/sec     1.05      5.4±0.33µs        ? ?/sec
run_condition/yes_using_resource/011_systems        1.00      5.8±0.30µs        ? ?/sec     1.06      6.2±0.50µs        ? ?/sec
run_condition/yes_using_resource/016_systems        1.01      6.9±0.47µs        ? ?/sec     1.00      6.9±0.33µs        ? ?/sec
run_condition/yes_using_resource/021_systems        1.00      8.3±0.35µs        ? ?/sec     1.02      8.5±0.29µs        ? ?/sec
run_condition/yes_using_resource/026_systems        1.00     10.2±0.41µs        ? ?/sec     1.02     10.4±0.46µs        ? ?/sec
run_condition/yes_using_resource/031_systems        1.00     11.8±0.34µs        ? ?/sec     1.02     12.1±0.38µs        ? ?/sec
run_condition/yes_using_resource/036_systems        1.00     13.1±0.34µs        ? ?/sec     1.03     13.5±0.65µs        ? ?/sec
run_condition/yes_using_resource/041_systems        1.00     14.9±0.55µs        ? ?/sec     1.03     15.3±0.64µs        ? ?/sec
run_condition/yes_using_resource/046_systems        1.00     16.3±0.48µs        ? ?/sec     1.02     16.6±0.47µs        ? ?/sec
run_condition/yes_using_resource/051_systems        1.00     18.5±0.86µs        ? ?/sec     1.01     18.6±0.72µs        ? ?/sec
run_condition/yes_using_resource/056_systems        1.00     18.9±0.36µs        ? ?/sec     1.04     19.7±0.92µs        ? ?/sec
run_condition/yes_using_resource/061_systems        1.00     20.7±0.50µs        ? ?/sec     1.02     21.1±0.58µs        ? ?/sec
run_condition/yes_using_resource/066_systems        1.00     22.5±0.85µs        ? ?/sec     1.05     23.5±1.16µs        ? ?/sec
run_condition/yes_using_resource/071_systems        1.00     24.3±0.79µs        ? ?/sec     1.02     24.7±0.82µs        ? ?/sec
run_condition/yes_using_resource/076_systems        1.00     26.3±1.33µs        ? ?/sec     1.00     26.4±0.88µs        ? ?/sec
run_condition/yes_using_resource/081_systems        1.00     27.8±0.86µs        ? ?/sec     1.00     27.9±0.91µs        ? ?/sec
run_condition/yes_using_resource/086_systems        1.00     30.0±1.20µs        ? ?/sec     1.02     30.4±1.09µs        ? ?/sec
run_condition/yes_using_resource/091_systems        1.00     31.7±0.78µs        ? ?/sec     1.03     32.7±1.59µs        ? ?/sec
run_condition/yes_using_resource/096_systems        1.00     35.0±1.11µs        ? ?/sec     1.03     35.9±1.14µs        ? ?/sec
run_condition/yes_using_resource/101_systems        1.00     35.9±0.85µs        ? ?/sec     1.03     37.1±1.21µs        ? ?/sec
run_empty_schedule/MultiThreaded                    1.02      5.3±0.19ns        ? ?/sec     1.00      5.2±0.17ns        ? ?/sec
run_empty_schedule/Simple                           1.00      4.9±0.12ns        ? ?/sec     1.00      4.9±0.16ns        ? ?/sec
run_empty_schedule/SingleThreaded                   1.00      8.2±0.21ns        ? ?/sec     1.01      8.3±0.26ns        ? ?/sec
schedule/base                                       1.00     22.5±1.02µs        ? ?/sec     1.03     23.1±1.78µs        ? ?/sec
sized_commands_0_bytes/2000_commands                1.00      9.6±0.20µs        ? ?/sec     1.00      9.7±0.44µs        ? ?/sec
sized_commands_0_bytes/4000_commands                1.00     19.2±0.59µs        ? ?/sec     1.01     19.4±0.86µs        ? ?/sec
sized_commands_0_bytes/6000_commands                1.00     28.9±1.52µs        ? ?/sec     1.01     29.2±1.69µs        ? ?/sec
sized_commands_0_bytes/8000_commands                1.01     39.0±2.47µs        ? ?/sec     1.00     38.5±1.59µs        ? ?/sec
sized_commands_12_bytes/2000_commands               1.01     11.8±0.59µs        ? ?/sec     1.00     11.8±0.40µs        ? ?/sec
sized_commands_12_bytes/4000_commands               1.00     23.4±0.63µs        ? ?/sec     1.01     23.6±0.96µs        ? ?/sec
sized_commands_12_bytes/6000_commands               1.00     35.2±1.04µs        ? ?/sec     1.03     36.3±2.07µs        ? ?/sec
sized_commands_12_bytes/8000_commands               1.00     46.9±2.57µs        ? ?/sec     1.02     48.0±3.15µs        ? ?/sec
sized_commands_512_bytes/2000_commands              1.00     54.9±3.09µs        ? ?/sec     1.00     55.0±2.48µs        ? ?/sec
sized_commands_512_bytes/4000_commands              1.00    110.5±8.48µs        ? ?/sec     1.01    111.6±8.68µs        ? ?/sec
sized_commands_512_bytes/6000_commands              1.00   169.5±19.02µs        ? ?/sec     1.03   174.5±16.91µs        ? ?/sec
sized_commands_512_bytes/8000_commands              1.00   228.2±24.57µs        ? ?/sec     1.02   231.9±29.54µs        ? ?/sec
spawn_commands/2000_entities                        1.00    130.2±7.37µs        ? ?/sec     1.04    134.9±9.51µs        ? ?/sec
spawn_commands/4000_entities                        1.00   262.3±16.12µs        ? ?/sec     1.04   273.5±32.46µs        ? ?/sec
spawn_commands/6000_entities                        1.00   391.9±20.37µs        ? ?/sec     1.02   401.5±29.56µs        ? ?/sec
spawn_commands/8000_entities                        1.00   535.8±29.21µs        ? ?/sec     1.04   559.9±52.18µs        ? ?/sec
spawn_world/10000_entities                          1.02   667.7±65.46µs        ? ?/sec     1.00   655.0±52.98µs        ? ?/sec
spawn_world/1000_entities                           1.05     70.2±7.74µs        ? ?/sec     1.00     66.9±7.17µs        ? ?/sec
spawn_world/100_entities                            1.00      6.4±0.66µs        ? ?/sec     1.04      6.7±0.75µs        ? ?/sec
spawn_world/10_entities                             1.00   626.1±64.99ns        ? ?/sec     1.07   668.1±69.87ns        ? ?/sec
spawn_world/1_entities                              1.00     64.3±7.26ns        ? ?/sec     1.07     68.9±8.56ns        ? ?/sec
world_entity/50000_entities                         1.00     80.3±2.13µs        ? ?/sec     1.00     80.6±1.97µs        ? ?/sec
world_get/50000_entities_sparse                     1.00    145.0±8.91µs        ? ?/sec     1.02    147.5±6.65µs        ? ?/sec
world_get/50000_entities_table                      1.00    107.0±3.80µs        ? ?/sec     1.05    111.9±8.39µs        ? ?/sec
world_query_for_each/50000_entities_sparse          1.00     43.6±1.27µs        ? ?/sec     1.02     44.4±2.00µs        ? ?/sec
world_query_for_each/50000_entities_table           1.00     21.4±0.66µs        ? ?/sec     1.03     22.0±0.73µs        ? ?/sec
world_query_get/50000_entities_sparse               1.00    154.7±4.60µs        ? ?/sec     1.03    158.8±7.32µs        ? ?/sec
world_query_get/50000_entities_sparse_wide          1.00    174.8±5.56µs        ? ?/sec     1.02    178.7±9.41µs        ? ?/sec
world_query_get/50000_entities_table                1.00    139.1±4.70µs        ? ?/sec     1.02    141.5±7.39µs        ? ?/sec
world_query_get/50000_entities_table_wide           1.00    137.3±5.61µs        ? ?/sec     1.03    140.7±5.91µs        ? ?/sec
world_query_iter/50000_entities_table               1.00     22.7±0.81µs        ? ?/sec     1.02     23.1±1.01µs        ? ?/sec
world_query_iter/50000_entities_sparse              1.00     49.3±1.28µs        ? ?/sec     1.02     50.1±3.30µs        ? ?/sec

@ItsDoot
ItsDoot requested a review from james7132 September 18, 2024 06:57
@alice-i-cecile

Copy link
Copy Markdown
Member

Code changes seem reasonable, but those benchmark results are super weird. Why would only some of the busy_systems benchmarks have a 40%+ slowdown? Can you rerun them and post the results?

@ItsDoot

ItsDoot commented Sep 19, 2024

Copy link
Copy Markdown
Contributor Author

@alice-i-cecile Reran on a different machine:

Full ECS suite benchmarks (this PR on left)
group                                               fetchmemoryusage                        main
-----                                               ----------------                        ----
add_remove/sparse_set                               1.00   489.9±17.31µs        ? ?/sec     1.00   488.1±15.10µs        ? ?/sec
add_remove/table                                    1.02   625.1±17.30µs        ? ?/sec     1.00   613.4±11.23µs        ? ?/sec
add_remove_big/sparse_set                           1.01   489.9±15.04µs        ? ?/sec     1.00   484.2±13.95µs        ? ?/sec
add_remove_big/table                                1.01  1557.7±218.60µs        ? ?/sec    1.00  1546.5±284.80µs        ? ?/sec
add_remove_very_big/table                           1.03     30.8±2.64ms        ? ?/sec     1.00     30.0±2.48ms        ? ?/sec
added_archetypes/archetype_count/100                1.00     36.9±2.16µs        ? ?/sec     1.05     38.8±2.87µs        ? ?/sec
added_archetypes/archetype_count/1000               1.00    361.6±6.49µs        ? ?/sec     1.05   378.4±10.40µs        ? ?/sec
added_archetypes/archetype_count/10000              1.00      5.3±0.31ms        ? ?/sec     1.07      5.7±0.49ms        ? ?/sec
added_archetypes/archetype_count/200                1.00     69.4±6.22µs        ? ?/sec     1.04     72.0±2.37µs        ? ?/sec
added_archetypes/archetype_count/2000               1.00   783.7±17.70µs        ? ?/sec     1.06   829.8±22.84µs        ? ?/sec
added_archetypes/archetype_count/500                1.00    170.7±2.78µs        ? ?/sec     1.05    179.1±8.09µs        ? ?/sec
added_archetypes/archetype_count/5000               1.00      2.2±0.12ms        ? ?/sec     1.06      2.3±0.09ms        ? ?/sec
build_schedule/1000_schedule                        1.00       2.2±0.02s        ? ?/sec     1.00       2.2±0.02s        ? ?/sec
build_schedule/1000_schedule_noconstraints          1.03     26.4±1.10ms        ? ?/sec     1.00     25.7±0.69ms        ? ?/sec
build_schedule/100_schedule                         1.00      9.6±0.11ms        ? ?/sec     1.02      9.8±0.13ms        ? ?/sec
build_schedule/100_schedule_noconstraints           1.00    467.2±7.11µs        ? ?/sec     1.05    492.2±9.55µs        ? ?/sec
build_schedule/500_schedule                         1.00    360.3±9.71ms        ? ?/sec     1.02    365.8±7.28ms        ? ?/sec
build_schedule/500_schedule_noconstraints           1.06      7.3±0.20ms        ? ?/sec     1.00      6.9±0.19ms        ? ?/sec
busy_systems/01x_entities_03_systems                1.16     44.0±4.17µs        ? ?/sec     1.00     37.8±1.30µs        ? ?/sec
busy_systems/01x_entities_06_systems                1.63    87.1±11.54µs        ? ?/sec     1.00     53.5±1.94µs        ? ?/sec
busy_systems/01x_entities_09_systems                1.17    105.1±4.47µs        ? ?/sec     1.00     89.6±4.15µs        ? ?/sec
busy_systems/01x_entities_12_systems                1.24    137.0±9.01µs        ? ?/sec     1.00    110.1±1.82µs        ? ?/sec
busy_systems/01x_entities_15_systems                1.16    164.1±9.20µs        ? ?/sec     1.00   141.0±10.94µs        ? ?/sec
busy_systems/02x_entities_03_systems                1.01     62.0±3.21µs        ? ?/sec     1.00     61.2±4.05µs        ? ?/sec
busy_systems/02x_entities_06_systems                1.00     98.4±7.45µs        ? ?/sec     1.09    107.3±9.81µs        ? ?/sec
busy_systems/02x_entities_09_systems                1.00    158.6±4.91µs        ? ?/sec     1.07    169.0±8.55µs        ? ?/sec
busy_systems/02x_entities_12_systems                1.00    201.3±3.47µs        ? ?/sec     1.08    216.8±8.06µs        ? ?/sec
busy_systems/02x_entities_15_systems                1.00    248.3±3.33µs        ? ?/sec     1.07   266.6±15.86µs        ? ?/sec
busy_systems/03x_entities_03_systems                1.02     89.5±2.42µs        ? ?/sec     1.00     88.2±3.68µs        ? ?/sec
busy_systems/03x_entities_06_systems                1.00   159.1±10.27µs        ? ?/sec     1.04   165.1±17.75µs        ? ?/sec
busy_systems/03x_entities_09_systems                1.06   252.6±20.72µs        ? ?/sec     1.00   239.0±14.89µs        ? ?/sec
busy_systems/03x_entities_12_systems                1.03    317.6±8.91µs        ? ?/sec     1.00   307.0±13.52µs        ? ?/sec
busy_systems/03x_entities_15_systems                1.01   405.2±11.48µs        ? ?/sec     1.00   399.7±16.30µs        ? ?/sec
busy_systems/04x_entities_03_systems                1.03    113.1±5.38µs        ? ?/sec     1.00    109.9±7.47µs        ? ?/sec
busy_systems/04x_entities_06_systems                1.02   219.9±16.47µs        ? ?/sec     1.00   216.2±19.77µs        ? ?/sec
busy_systems/04x_entities_09_systems                1.00   313.1±10.81µs        ? ?/sec     1.01   317.0±20.78µs        ? ?/sec
busy_systems/04x_entities_12_systems                1.08   460.8±40.35µs        ? ?/sec     1.00   424.8±16.89µs        ? ?/sec
busy_systems/04x_entities_15_systems                1.03   542.5±25.18µs        ? ?/sec     1.00   527.4±32.97µs        ? ?/sec
busy_systems/05x_entities_03_systems                1.05   155.6±25.35µs        ? ?/sec     1.00    147.7±7.02µs        ? ?/sec
busy_systems/05x_entities_06_systems                1.00   281.0±28.39µs        ? ?/sec     1.14   319.5±36.99µs        ? ?/sec
busy_systems/05x_entities_09_systems                1.00   431.3±33.10µs        ? ?/sec     1.02   441.8±25.75µs        ? ?/sec
busy_systems/05x_entities_12_systems                1.00   549.3±27.48µs        ? ?/sec     1.05   578.4±22.00µs        ? ?/sec
busy_systems/05x_entities_15_systems                1.00   713.0±60.04µs        ? ?/sec     1.05   745.4±48.06µs        ? ?/sec
contrived/01x_entities_03_systems                   1.00     18.9±1.68µs        ? ?/sec     1.03     19.4±1.27µs        ? ?/sec
contrived/01x_entities_06_systems                   1.00     36.3±2.11µs        ? ?/sec     1.00     36.2±1.70µs        ? ?/sec
contrived/01x_entities_09_systems                   1.01     59.6±3.33µs        ? ?/sec     1.00     59.2±2.64µs        ? ?/sec
contrived/01x_entities_12_systems                   1.00     75.6±1.86µs        ? ?/sec     1.05     79.2±4.85µs        ? ?/sec
contrived/01x_entities_15_systems                   1.00     91.3±3.95µs        ? ?/sec     1.05     96.0±2.75µs        ? ?/sec
contrived/02x_entities_03_systems                   1.00     31.3±3.31µs        ? ?/sec     1.01     31.5±2.51µs        ? ?/sec
contrived/02x_entities_06_systems                   1.00     57.9±2.56µs        ? ?/sec     1.06     61.4±2.33µs        ? ?/sec
contrived/02x_entities_09_systems                   1.00     83.0±5.64µs        ? ?/sec     1.04     86.2±2.79µs        ? ?/sec
contrived/02x_entities_12_systems                   1.00    113.2±5.43µs        ? ?/sec     1.02    115.2±5.04µs        ? ?/sec
contrived/02x_entities_15_systems                   1.00    136.9±6.03µs        ? ?/sec     1.05    143.7±7.94µs        ? ?/sec
contrived/03x_entities_03_systems                   1.00     40.7±3.21µs        ? ?/sec     1.21     49.1±4.50µs        ? ?/sec
contrived/03x_entities_06_systems                   1.00     77.1±1.66µs        ? ?/sec     1.08     83.2±4.52µs        ? ?/sec
contrived/03x_entities_09_systems                   1.00    110.7±1.71µs        ? ?/sec     1.06    117.6±4.18µs        ? ?/sec
contrived/03x_entities_12_systems                   1.00    150.7±6.33µs        ? ?/sec     1.04    157.0±5.94µs        ? ?/sec
contrived/03x_entities_15_systems                   1.00    185.9±9.08µs        ? ?/sec     1.04    193.9±7.24µs        ? ?/sec
contrived/04x_entities_03_systems                   1.00     50.7±2.32µs        ? ?/sec     1.09     55.4±5.10µs        ? ?/sec
contrived/04x_entities_06_systems                   1.00     99.2±3.45µs        ? ?/sec     1.03    102.4±3.43µs        ? ?/sec
contrived/04x_entities_09_systems                   1.00    138.8±4.65µs        ? ?/sec     1.10    152.1±6.68µs        ? ?/sec
contrived/04x_entities_12_systems                   1.00    186.2±9.13µs        ? ?/sec     1.08   200.9±10.21µs        ? ?/sec
contrived/04x_entities_15_systems                   1.00    227.2±6.58µs        ? ?/sec     1.12   254.4±15.97µs        ? ?/sec
contrived/05x_entities_03_systems                   1.00     60.9±6.22µs        ? ?/sec     1.19     72.3±6.94µs        ? ?/sec
contrived/05x_entities_06_systems                   1.00    113.9±3.34µs        ? ?/sec     1.08    122.7±8.02µs        ? ?/sec
contrived/05x_entities_09_systems                   1.00    161.0±6.96µs        ? ?/sec     1.11    178.7±5.32µs        ? ?/sec
contrived/05x_entities_12_systems                   1.00    214.0±5.55µs        ? ?/sec     1.15   245.3±17.93µs        ? ?/sec
contrived/05x_entities_15_systems                   1.00   265.1±10.05µs        ? ?/sec     1.13   298.9±17.28µs        ? ?/sec
empty_commands/0_entities                           1.10      4.8±0.07ns        ? ?/sec     1.00      4.3±0.07ns        ? ?/sec
empty_systems/000_systems                           1.00      3.2±0.06ns        ? ?/sec     1.00      3.2±0.06ns        ? ?/sec
empty_systems/001_systems                           1.01  1768.6±70.00ns        ? ?/sec     1.00  1746.2±66.92ns        ? ?/sec
empty_systems/002_systems                           1.01      2.7±0.12µs        ? ?/sec     1.00      2.7±0.07µs        ? ?/sec
empty_systems/003_systems                           1.00      3.6±0.12µs        ? ?/sec     1.02      3.6±0.13µs        ? ?/sec
empty_systems/004_systems                           1.00      4.1±0.14µs        ? ?/sec     1.00      4.1±0.21µs        ? ?/sec
empty_systems/005_systems                           1.04      5.1±0.21µs        ? ?/sec     1.00      5.0±0.15µs        ? ?/sec
empty_systems/010_systems                           1.03      8.7±0.39µs        ? ?/sec     1.00      8.5±0.17µs        ? ?/sec
empty_systems/015_systems                           1.04     12.5±0.34µs        ? ?/sec     1.00     12.0±0.16µs        ? ?/sec
empty_systems/020_systems                           1.01     17.3±0.63µs        ? ?/sec     1.00     17.0±0.31µs        ? ?/sec
empty_systems/025_systems                           1.01     21.5±0.80µs        ? ?/sec     1.00     21.2±0.58µs        ? ?/sec
empty_systems/030_systems                           1.01     25.4±0.63µs        ? ?/sec     1.00     25.3±0.37µs        ? ?/sec
empty_systems/035_systems                           1.00     28.5±0.73µs        ? ?/sec     1.01     28.9±0.62µs        ? ?/sec
empty_systems/040_systems                           1.00     32.7±0.75µs        ? ?/sec     1.02     33.2±0.61µs        ? ?/sec
empty_systems/045_systems                           1.00     36.8±0.88µs        ? ?/sec     1.01     37.3±0.75µs        ? ?/sec
empty_systems/050_systems                           1.00     42.6±1.07µs        ? ?/sec     1.01     43.2±0.84µs        ? ?/sec
empty_systems/055_systems                           1.03     47.6±1.62µs        ? ?/sec     1.00     46.0±0.84µs        ? ?/sec
empty_systems/060_systems                           1.00     49.7±1.15µs        ? ?/sec     1.01     50.4±1.06µs        ? ?/sec
empty_systems/065_systems                           1.00     53.6±1.30µs        ? ?/sec     1.02     54.6±0.80µs        ? ?/sec
empty_systems/070_systems                           1.01     59.5±1.57µs        ? ?/sec     1.00     58.8±1.06µs        ? ?/sec
empty_systems/075_systems                           1.00     61.5±3.30µs        ? ?/sec     1.03     63.2±1.19µs        ? ?/sec
empty_systems/080_systems                           1.00     66.4±1.76µs        ? ?/sec     1.01     67.0±1.66µs        ? ?/sec
empty_systems/085_systems                           1.00     71.6±1.14µs        ? ?/sec     1.00     71.9±2.01µs        ? ?/sec
empty_systems/090_systems                           1.00     75.7±1.20µs        ? ?/sec     1.00     75.4±1.57µs        ? ?/sec
empty_systems/095_systems                           1.00     81.5±1.31µs        ? ?/sec     1.01     82.2±1.85µs        ? ?/sec
empty_systems/100_systems                           1.00     83.7±4.33µs        ? ?/sec     1.00     83.8±2.44µs        ? ?/sec
entity_hash/entity_set_build/100                    1.00   548.2±11.79ns 174.0 MElem/sec    1.01   554.9±30.38ns 171.9 MElem/sec
entity_hash/entity_set_build/1000                   1.00      3.6±0.62µs 262.0 MElem/sec    1.01      3.7±0.31µs 258.8 MElem/sec
entity_hash/entity_set_build/10000                  1.08     42.5±4.37µs 224.6 MElem/sec    1.00     39.4±5.63µs 241.9 MElem/sec
entity_hash/entity_set_build/316                    1.01  1635.2±53.63ns 184.3 MElem/sec    1.00  1620.6±71.40ns 186.0 MElem/sec
entity_hash/entity_set_build/3162                   1.00     10.4±0.64µs 289.8 MElem/sec    1.08     11.2±1.01µs 268.3 MElem/sec
entity_hash/entity_set_lookup_hit/100               1.02    148.9±4.75ns 640.4 MElem/sec    1.00    146.6±4.54ns 650.6 MElem/sec
entity_hash/entity_set_lookup_hit/1000              1.01  1538.8±23.21ns 619.7 MElem/sec    1.00  1530.0±17.36ns 623.3 MElem/sec
entity_hash/entity_set_lookup_hit/10000             1.00     17.2±0.54µs 553.6 MElem/sec    1.04     17.9±0.59µs 533.3 MElem/sec
entity_hash/entity_set_lookup_hit/316               1.01    468.2±8.63ns 643.7 MElem/sec    1.00    462.7±7.16ns 651.3 MElem/sec
entity_hash/entity_set_lookup_hit/3162              1.00      4.9±0.09µs 609.4 MElem/sec    1.02      5.1±0.08µs 596.0 MElem/sec
entity_hash/entity_set_lookup_miss_gen/100          1.00    229.1±2.48ns 416.3 MElem/sec    1.02    232.7±5.88ns 409.8 MElem/sec
entity_hash/entity_set_lookup_miss_gen/1000         1.00      2.3±0.04µs 418.9 MElem/sec    1.00      2.3±0.05µs 417.6 MElem/sec
entity_hash/entity_set_lookup_miss_gen/10000        1.00     52.4±2.08µs 182.2 MElem/sec    1.25     65.5±1.95µs 145.6 MElem/sec
entity_hash/entity_set_lookup_miss_gen/316          1.00   808.3±16.50ns 372.8 MElem/sec    1.03   829.3±15.81ns 363.4 MElem/sec
entity_hash/entity_set_lookup_miss_gen/3162         1.00     11.5±1.46µs 262.4 MElem/sec    1.87     21.4±0.69µs 140.7 MElem/sec
entity_hash/entity_set_lookup_miss_id/100           1.00    134.3±1.86ns 710.0 MElem/sec    1.08    145.0±2.73ns 657.7 MElem/sec
entity_hash/entity_set_lookup_miss_id/1000          1.00  1329.5±17.18ns 717.3 MElem/sec    1.01  1345.3±26.92ns 708.9 MElem/sec
entity_hash/entity_set_lookup_miss_id/10000         1.24     48.0±2.49µs 198.7 MElem/sec    1.00     38.7±1.94µs 246.7 MElem/sec
entity_hash/entity_set_lookup_miss_id/316           1.00   500.0±11.12ns 602.7 MElem/sec    1.16   579.3±11.70ns 520.2 MElem/sec
entity_hash/entity_set_lookup_miss_id/3162          1.00      7.2±0.20µs 420.9 MElem/sec    1.29      9.3±0.23µs 325.5 MElem/sec
event_propagation/four_event_types                  1.01    366.9±7.22µs        ? ?/sec     1.00   364.6±11.45µs        ? ?/sec
event_propagation/single_event_type                 1.02    446.2±9.93µs        ? ?/sec     1.00   435.6±36.39µs        ? ?/sec
event_propagation/single_event_type_no_listeners    1.00    305.7±4.56µs        ? ?/sec     1.01    307.6±4.61µs        ? ?/sec
events_iter/size_16_events_100                      1.00     49.9±0.63ns        ? ?/sec     1.02     51.1±0.79ns        ? ?/sec
events_iter/size_16_events_1000                     1.04    412.8±3.52ns        ? ?/sec     1.00    396.2±6.56ns        ? ?/sec
events_iter/size_16_events_10000                    1.05      4.0±0.08µs        ? ?/sec     1.00      3.9±0.07µs        ? ?/sec
events_iter/size_16_events_50000                    1.03     20.2±0.26µs        ? ?/sec     1.00     19.6±0.41µs        ? ?/sec
events_iter/size_4_events_100                       1.00     49.9±0.56ns        ? ?/sec     1.03     51.2±1.01ns        ? ?/sec
events_iter/size_4_events_1000                      1.04    412.9±3.61ns        ? ?/sec     1.00    395.5±8.41ns        ? ?/sec
events_iter/size_4_events_10000                     1.05      4.0±0.04µs        ? ?/sec     1.00      3.9±0.06µs        ? ?/sec
events_iter/size_4_events_50000                     1.04     20.2±0.19µs        ? ?/sec     1.00     19.5±0.39µs        ? ?/sec
events_iter/size_512_events_100                     1.00     46.6±0.75ns        ? ?/sec     1.04     48.6±1.07ns        ? ?/sec
events_iter/size_512_events_1000                    1.00    374.6±4.09ns        ? ?/sec     1.08    403.1±8.53ns        ? ?/sec
events_iter/size_512_events_10000                   1.00      3.6±0.05µs        ? ?/sec     1.10      4.0±0.13µs        ? ?/sec
events_iter/size_512_events_50000                   1.00     18.1±0.22µs        ? ?/sec     1.07     19.4±0.41µs        ? ?/sec
events_send/size_16_events_100                      1.00   124.8±62.42ns        ? ?/sec     1.09   136.0±89.97ns        ? ?/sec
events_send/size_16_events_1000                     1.00    846.7±6.63ns        ? ?/sec     1.07   904.0±18.70ns        ? ?/sec
events_send/size_16_events_10000                    1.00     13.9±1.23µs        ? ?/sec     1.10     15.3±2.12µs        ? ?/sec
events_send/size_16_events_50000                    1.00    76.3±11.11µs        ? ?/sec     1.30    99.1±18.40µs        ? ?/sec
events_send/size_4_events_100                       1.00     71.5±4.55ns        ? ?/sec     1.01     72.4±0.96ns        ? ?/sec
events_send/size_4_events_1000                      1.02   701.5±24.17ns        ? ?/sec     1.00   687.6±11.53ns        ? ?/sec
events_send/size_4_events_10000                     1.00     10.4±0.79µs        ? ?/sec     1.12     11.6±1.54µs        ? ?/sec
events_send/size_4_events_50000                     1.00     51.5±1.98µs        ? ?/sec     1.13     58.0±6.89µs        ? ?/sec
events_send/size_512_events_100                     1.00  1342.8±13.90ns        ? ?/sec     1.05  1412.9±36.17ns        ? ?/sec
events_send/size_512_events_1000                    1.00     13.4±0.14µs        ? ?/sec     1.05     14.1±0.21µs        ? ?/sec
events_send/size_512_events_10000                   1.00   168.8±12.93µs        ? ?/sec     1.03   174.3±10.75µs        ? ?/sec
events_send/size_512_events_50000                   1.04  1442.4±194.05µs        ? ?/sec    1.00  1383.1±147.08µs        ? ?/sec
fake_commands/2000_commands                         1.08      9.1±0.31µs        ? ?/sec     1.00      8.4±0.15µs        ? ?/sec
fake_commands/4000_commands                         1.06     18.4±0.33µs        ? ?/sec     1.00     17.4±0.39µs        ? ?/sec
fake_commands/6000_commands                         1.09     29.6±1.38µs        ? ?/sec     1.00     27.2±1.28µs        ? ?/sec
fake_commands/8000_commands                         1.06     39.0±1.65µs        ? ?/sec     1.00     36.7±1.64µs        ? ?/sec
get_or_spawn/batched                                1.01   230.1±18.44µs        ? ?/sec     1.00   226.9±17.81µs        ? ?/sec
get_or_spawn/individual                             1.04   479.2±55.58µs        ? ?/sec     1.00   460.6±47.97µs        ? ?/sec
heavy_compute/base                                  1.06    209.2±5.45µs        ? ?/sec     1.00    198.2±4.38µs        ? ?/sec
insert_commands/insert                              1.00   355.9±27.98µs        ? ?/sec     1.03   365.8±32.58µs        ? ?/sec
insert_commands/insert_batch                        1.00   195.9±18.73µs        ? ?/sec     1.11   218.3±14.30µs        ? ?/sec
insert_simple/base                                  1.01   228.0±11.47µs        ? ?/sec     1.00   226.6±12.99µs        ? ?/sec
insert_simple/unbatched                             1.01    509.2±7.70µs        ? ?/sec     1.00    502.6±9.38µs        ? ?/sec
iter_fragmented(4096)_empty/foreach_sparse          1.14      4.8±0.05µs        ? ?/sec     1.00      4.2±0.08µs        ? ?/sec
iter_fragmented(4096)_empty/foreach_table           1.01      2.2±0.03µs        ? ?/sec     1.00      2.1±0.03µs        ? ?/sec
iter_fragmented/base                                1.00   276.9±13.25ns        ? ?/sec     1.02   281.9±15.51ns        ? ?/sec
iter_fragmented/foreach                             1.04   137.1±29.16ns        ? ?/sec     1.00   131.4±24.30ns        ? ?/sec
iter_fragmented/foreach_wide                        1.00      4.3±0.26µs        ? ?/sec     1.15      4.9±0.30µs        ? ?/sec
iter_fragmented/wide                                1.00      4.2±0.14µs        ? ?/sec     1.04      4.4±0.33µs        ? ?/sec
iter_fragmented_sparse/base                         1.00      6.1±0.05ns        ? ?/sec     1.00      6.1±0.14ns        ? ?/sec
iter_fragmented_sparse/foreach                      1.00      6.5±0.06ns        ? ?/sec     1.01      6.6±0.25ns        ? ?/sec
iter_fragmented_sparse/foreach_wide                 1.43     41.0±0.70ns        ? ?/sec     1.00     28.6±1.00ns        ? ?/sec
iter_fragmented_sparse/wide                         1.01     30.8±1.12ns        ? ?/sec     1.00     30.6±0.85ns        ? ?/sec
iter_simple/base                                    1.00      7.8±0.09µs        ? ?/sec     1.02      8.0±0.19µs        ? ?/sec
iter_simple/foreach                                 1.00      7.8±0.15µs        ? ?/sec     1.02      8.0±0.24µs        ? ?/sec
iter_simple/foreach_hybrid                          1.00      8.5±0.11µs        ? ?/sec     1.01      8.5±0.20µs        ? ?/sec
iter_simple/foreach_sparse_set                      1.00     13.0±0.45µs        ? ?/sec     1.06     13.8±0.76µs        ? ?/sec
iter_simple/foreach_wide                            1.02     31.8±1.34µs        ? ?/sec     1.00     31.1±1.04µs        ? ?/sec
iter_simple/foreach_wide_sparse_set                 1.00     76.7±3.86µs        ? ?/sec     1.03     79.0±2.41µs        ? ?/sec
iter_simple/sparse_set                              1.00     13.4±0.44µs        ? ?/sec     1.07     14.3±0.95µs        ? ?/sec
iter_simple/system                                  1.01      8.0±0.10µs        ? ?/sec     1.00      7.9±0.22µs        ? ?/sec
iter_simple/wide                                    1.08     37.0±4.32µs        ? ?/sec     1.00     34.2±0.90µs        ? ?/sec
iter_simple/wide_sparse_set                         1.00     81.0±1.38µs        ? ?/sec     1.01     82.0±2.03µs        ? ?/sec
no_archetypes/system_count/0                        1.00      6.6±0.09ns        ? ?/sec     1.01      6.7±0.12ns        ? ?/sec
no_archetypes/system_count/100                      1.02  1096.5±35.12ns        ? ?/sec     1.00  1074.6±26.86ns        ? ?/sec
no_archetypes/system_count/20                       1.03    218.3±1.69ns        ? ?/sec     1.00    212.0±4.00ns        ? ?/sec
no_archetypes/system_count/40                       1.07    439.3±4.98ns        ? ?/sec     1.00    408.9±9.97ns        ? ?/sec
no_archetypes/system_count/60                       1.09    670.9±6.76ns        ? ?/sec     1.00   615.8±12.93ns        ? ?/sec
no_archetypes/system_count/80                       1.02   884.6±19.76ns        ? ?/sec     1.00   869.9±13.87ns        ? ?/sec
observe/trigger_simple                              1.00     40.9±0.53µs        ? ?/sec     1.00     40.9±0.60µs        ? ?/sec
observe/trigger_targets_simple/10000_entity         1.00   735.8±38.33µs        ? ?/sec     1.08  794.4±137.44µs        ? ?/sec
par_iter_simple/hybrid                              1.08     38.2±4.71µs        ? ?/sec     1.00     35.4±8.27µs        ? ?/sec
par_iter_simple/with_0_fragment                     1.11     30.1±2.82µs        ? ?/sec     1.00     27.1±2.57µs        ? ?/sec
par_iter_simple/with_1000_fragment                  1.21     41.0±4.88µs        ? ?/sec     1.00     34.0±4.29µs        ? ?/sec
par_iter_simple/with_100_fragment                   1.19     33.0±2.36µs        ? ?/sec     1.00     27.9±2.47µs        ? ?/sec
par_iter_simple/with_10_fragment                    1.10     30.1±2.96µs        ? ?/sec     1.00     27.5±2.21µs        ? ?/sec
query_get/50000_entities_sparse                     1.01    157.8±3.72µs        ? ?/sec     1.00    155.5±6.86µs        ? ?/sec
query_get/50000_entities_table                      1.00    155.3±4.13µs        ? ?/sec     1.00    156.1±4.67µs        ? ?/sec
query_get_many_10/50000_calls_sparse                1.00      2.2±0.21ms        ? ?/sec     1.01      2.2±0.17ms        ? ?/sec
query_get_many_10/50000_calls_table                 1.01      2.1±0.20ms        ? ?/sec     1.00      2.1±0.18ms        ? ?/sec
query_get_many_2/50000_calls_sparse                 1.00   365.4±19.82µs        ? ?/sec     1.02   371.3±34.18µs        ? ?/sec
query_get_many_2/50000_calls_table                  1.00   353.9±23.62µs        ? ?/sec     1.03   363.8±30.98µs        ? ?/sec
query_get_many_5/50000_calls_sparse                 1.01   892.6±45.75µs        ? ?/sec     1.00   882.4±60.56µs        ? ?/sec
query_get_many_5/50000_calls_table                  1.01   915.7±41.86µs        ? ?/sec     1.00   907.4±34.87µs        ? ?/sec
run_condition/no/001_systems                        1.00     96.8±2.79ns        ? ?/sec     1.02     98.6±2.30ns        ? ?/sec
run_condition/no/006_systems                        1.00    308.4±5.38ns        ? ?/sec     1.03    319.1±6.44ns        ? ?/sec
run_condition/no/011_systems                        1.00    512.7±8.24ns        ? ?/sec     1.03   527.9±11.88ns        ? ?/sec
run_condition/no/016_systems                        1.00    716.5±9.84ns        ? ?/sec     1.03   734.8±13.85ns        ? ?/sec
run_condition/no/021_systems                        1.00   916.4±18.00ns        ? ?/sec     1.03   941.4±17.89ns        ? ?/sec
run_condition/no/026_systems                        1.00  1126.6±25.31ns        ? ?/sec     1.01  1142.3±21.73ns        ? ?/sec
run_condition/no/031_systems                        1.00  1320.5±25.33ns        ? ?/sec     1.02  1352.4±31.85ns        ? ?/sec
run_condition/no/036_systems                        1.00  1523.2±27.20ns        ? ?/sec     1.02  1555.9±18.12ns        ? ?/sec
run_condition/no/041_systems                        1.00  1721.8±29.00ns        ? ?/sec     1.02  1760.2±51.66ns        ? ?/sec
run_condition/no/046_systems                        1.00  1929.7±29.27ns        ? ?/sec     1.02  1966.5±32.59ns        ? ?/sec
run_condition/no/051_systems                        1.00      2.1±0.03µs        ? ?/sec     1.02      2.2±0.02µs        ? ?/sec
run_condition/no/056_systems                        1.00      2.3±0.04µs        ? ?/sec     1.03      2.4±0.05µs        ? ?/sec
run_condition/no/061_systems                        1.00      2.5±0.05µs        ? ?/sec     1.02      2.6±0.05µs        ? ?/sec
run_condition/no/066_systems                        1.00      2.7±0.05µs        ? ?/sec     1.03      2.8±0.05µs        ? ?/sec
run_condition/no/071_systems                        1.00      2.9±0.05µs        ? ?/sec     1.03      3.0±0.07µs        ? ?/sec
run_condition/no/076_systems                        1.00      3.1±0.04µs        ? ?/sec     1.03      3.2±0.08µs        ? ?/sec
run_condition/no/081_systems                        1.00      3.3±0.05µs        ? ?/sec     1.04      3.4±0.07µs        ? ?/sec
run_condition/no/086_systems                        1.00      3.5±0.07µs        ? ?/sec     1.03      3.6±0.08µs        ? ?/sec
run_condition/no/091_systems                        1.00      3.7±0.06µs        ? ?/sec     1.04      3.9±0.09µs        ? ?/sec
run_condition/no/096_systems                        1.00      3.9±0.07µs        ? ?/sec     1.04      4.1±0.10µs        ? ?/sec
run_condition/no/101_systems                        1.00      4.1±0.05µs        ? ?/sec     1.05      4.3±0.16µs        ? ?/sec
run_condition/yes/001_systems                       1.00  1807.2±59.21ns        ? ?/sec     1.01  1830.1±91.35ns        ? ?/sec
run_condition/yes/006_systems                       1.04      6.0±0.42µs        ? ?/sec     1.00      5.8±0.24µs        ? ?/sec
run_condition/yes/011_systems                       1.03      9.4±0.31µs        ? ?/sec     1.00      9.1±0.26µs        ? ?/sec
run_condition/yes/016_systems                       1.01     13.2±0.54µs        ? ?/sec     1.00     13.0±0.40µs        ? ?/sec
run_condition/yes/021_systems                       1.03     18.3±0.36µs        ? ?/sec     1.00     17.7±0.41µs        ? ?/sec
run_condition/yes/026_systems                       1.04     22.7±0.93µs        ? ?/sec     1.00     22.0±0.56µs        ? ?/sec
run_condition/yes/031_systems                       1.00     26.4±0.70µs        ? ?/sec     1.00     26.4±1.15µs        ? ?/sec
run_condition/yes/036_systems                       1.05     31.0±0.80µs        ? ?/sec     1.00     29.6±0.65µs        ? ?/sec
run_condition/yes/041_systems                       1.04     35.5±0.66µs        ? ?/sec     1.00     34.2±0.55µs        ? ?/sec
run_condition/yes/046_systems                       1.02     38.8±0.78µs        ? ?/sec     1.00     37.9±0.73µs        ? ?/sec
run_condition/yes/051_systems                       1.00     43.0±0.94µs        ? ?/sec     1.00     43.2±1.07µs        ? ?/sec
run_condition/yes/056_systems                       1.04     47.6±0.93µs        ? ?/sec     1.00     45.9±1.27µs        ? ?/sec
run_condition/yes/061_systems                       1.01     51.4±0.86µs        ? ?/sec     1.00     50.7±1.17µs        ? ?/sec
run_condition/yes/066_systems                       1.01     55.6±0.90µs        ? ?/sec     1.00     55.2±1.04µs        ? ?/sec
run_condition/yes/071_systems                       1.00     59.4±1.01µs        ? ?/sec     1.00     59.1±1.48µs        ? ?/sec
run_condition/yes/076_systems                       1.01     64.0±1.62µs        ? ?/sec     1.00     63.5±0.95µs        ? ?/sec
run_condition/yes/081_systems                       1.02     68.7±1.50µs        ? ?/sec     1.00     67.4±1.07µs        ? ?/sec
run_condition/yes/086_systems                       1.01     72.4±2.13µs        ? ?/sec     1.00     71.5±1.62µs        ? ?/sec
run_condition/yes/091_systems                       1.01     76.8±1.16µs        ? ?/sec     1.00     76.1±1.85µs        ? ?/sec
run_condition/yes/096_systems                       1.02     82.9±1.36µs        ? ?/sec     1.00     81.4±2.11µs        ? ?/sec
run_condition/yes/101_systems                       1.01     84.4±3.79µs        ? ?/sec     1.00     83.7±1.57µs        ? ?/sec
run_condition/yes_using_query/001_systems           1.00  1737.9±88.65ns        ? ?/sec     1.04  1800.0±180.70ns        ? ?/sec
run_condition/yes_using_query/006_systems           1.00      5.7±0.18µs        ? ?/sec     1.01      5.8±0.20µs        ? ?/sec
run_condition/yes_using_query/011_systems           1.03     10.0±0.39µs        ? ?/sec     1.00      9.7±0.28µs        ? ?/sec
run_condition/yes_using_query/016_systems           1.04     13.4±0.59µs        ? ?/sec     1.00     12.8±0.20µs        ? ?/sec
run_condition/yes_using_query/021_systems           1.00     17.7±0.54µs        ? ?/sec     1.00     17.6±0.20µs        ? ?/sec
run_condition/yes_using_query/026_systems           1.00     22.0±0.53µs        ? ?/sec     1.01     22.3±0.62µs        ? ?/sec
run_condition/yes_using_query/031_systems           1.03     27.0±0.59µs        ? ?/sec     1.00     26.2±0.52µs        ? ?/sec
run_condition/yes_using_query/036_systems           1.07     31.3±0.81µs        ? ?/sec     1.00     29.3±0.55µs        ? ?/sec
run_condition/yes_using_query/041_systems           1.02     34.9±0.84µs        ? ?/sec     1.00     34.2±0.71µs        ? ?/sec
run_condition/yes_using_query/046_systems           1.00     36.9±1.03µs        ? ?/sec     1.03     37.9±0.64µs        ? ?/sec
run_condition/yes_using_query/051_systems           1.02     44.2±0.72µs        ? ?/sec     1.00     43.4±0.94µs        ? ?/sec
run_condition/yes_using_query/056_systems           1.02     47.0±1.55µs        ? ?/sec     1.00     46.2±0.96µs        ? ?/sec
run_condition/yes_using_query/061_systems           1.01     51.0±0.78µs        ? ?/sec     1.00     50.6±0.76µs        ? ?/sec
run_condition/yes_using_query/066_systems           1.00     55.3±1.12µs        ? ?/sec     1.00     55.1±0.83µs        ? ?/sec
run_condition/yes_using_query/071_systems           1.01     59.5±0.89µs        ? ?/sec     1.00     58.9±1.00µs        ? ?/sec
run_condition/yes_using_query/076_systems           1.01     64.0±1.24µs        ? ?/sec     1.00     63.2±1.30µs        ? ?/sec
run_condition/yes_using_query/081_systems           1.02     67.6±1.82µs        ? ?/sec     1.00     66.3±1.48µs        ? ?/sec
run_condition/yes_using_query/086_systems           1.03     72.3±1.30µs        ? ?/sec     1.00     70.2±2.27µs        ? ?/sec
run_condition/yes_using_query/091_systems           1.01     76.0±1.32µs        ? ?/sec     1.00     75.4±1.45µs        ? ?/sec
run_condition/yes_using_query/096_systems           1.00     80.8±2.04µs        ? ?/sec     1.02     82.0±1.08µs        ? ?/sec
run_condition/yes_using_query/101_systems           1.02     84.6±2.40µs        ? ?/sec     1.00     83.3±1.69µs        ? ?/sec
run_condition/yes_using_resource/001_systems        1.00  1770.4±64.27ns        ? ?/sec     1.02  1806.7±74.47ns        ? ?/sec
run_condition/yes_using_resource/006_systems        1.04      5.9±0.29µs        ? ?/sec     1.00      5.7±0.19µs        ? ?/sec
run_condition/yes_using_resource/011_systems        1.03     10.0±0.38µs        ? ?/sec     1.00      9.7±0.17µs        ? ?/sec
run_condition/yes_using_resource/016_systems        1.00     12.9±0.33µs        ? ?/sec     1.00     12.9±0.22µs        ? ?/sec
run_condition/yes_using_resource/021_systems        1.01     17.9±0.77µs        ? ?/sec     1.00     17.7±0.47µs        ? ?/sec
run_condition/yes_using_resource/026_systems        1.00     22.1±1.19µs        ? ?/sec     1.00     22.0±0.44µs        ? ?/sec
run_condition/yes_using_resource/031_systems        1.00     26.0±0.68µs        ? ?/sec     1.00     26.0±0.52µs        ? ?/sec
run_condition/yes_using_resource/036_systems        1.04     30.4±0.58µs        ? ?/sec     1.00     29.3±0.59µs        ? ?/sec
run_condition/yes_using_resource/041_systems        1.01     34.0±1.06µs        ? ?/sec     1.00     33.8±0.52µs        ? ?/sec
run_condition/yes_using_resource/046_systems        1.00     37.6±1.03µs        ? ?/sec     1.01     38.0±0.82µs        ? ?/sec
run_condition/yes_using_resource/051_systems        1.00     43.4±1.44µs        ? ?/sec     1.01     43.7±0.72µs        ? ?/sec
run_condition/yes_using_resource/056_systems        1.00     45.8±1.43µs        ? ?/sec     1.02     46.5±0.62µs        ? ?/sec
run_condition/yes_using_resource/061_systems        1.00     49.8±1.06µs        ? ?/sec     1.02     50.7±0.69µs        ? ?/sec
run_condition/yes_using_resource/066_systems        1.00     54.0±0.77µs        ? ?/sec     1.01     54.8±0.81µs        ? ?/sec
run_condition/yes_using_resource/071_systems        1.00     58.3±1.65µs        ? ?/sec     1.01     58.9±1.75µs        ? ?/sec
run_condition/yes_using_resource/076_systems        1.00     62.4±2.73µs        ? ?/sec     1.02     63.4±1.10µs        ? ?/sec
run_condition/yes_using_resource/081_systems        1.00     65.9±1.59µs        ? ?/sec     1.02     67.1±1.25µs        ? ?/sec
run_condition/yes_using_resource/086_systems        1.00     69.7±1.36µs        ? ?/sec     1.03     72.1±1.45µs        ? ?/sec
run_condition/yes_using_resource/091_systems        1.00     73.6±1.31µs        ? ?/sec     1.03     75.8±1.53µs        ? ?/sec
run_condition/yes_using_resource/096_systems        1.00     79.6±1.42µs        ? ?/sec     1.03     82.0±1.86µs        ? ?/sec
run_condition/yes_using_resource/101_systems        1.01     84.4±2.64µs        ? ?/sec     1.00     83.6±1.90µs        ? ?/sec
run_empty_schedule/MultiThreaded                    1.06      3.4±0.08ns        ? ?/sec     1.00      3.2±0.07ns        ? ?/sec
run_empty_schedule/Simple                           1.00      3.9±0.06ns        ? ?/sec     1.00      3.9±0.08ns        ? ?/sec
run_empty_schedule/SingleThreaded                   1.00      6.7±0.15ns        ? ?/sec     1.00      6.7±0.10ns        ? ?/sec
schedule/base                                       1.00     26.8±1.40µs        ? ?/sec     1.01     27.1±1.93µs        ? ?/sec
sized_commands_0_bytes/2000_commands                1.00      7.8±0.17µs        ? ?/sec     1.00      7.8±0.16µs        ? ?/sec
sized_commands_0_bytes/4000_commands                1.00     15.6±0.34µs        ? ?/sec     1.00     15.5±0.33µs        ? ?/sec
sized_commands_0_bytes/6000_commands                1.01     23.9±0.50µs        ? ?/sec     1.00     23.7±0.46µs        ? ?/sec
sized_commands_0_bytes/8000_commands                1.01     33.3±1.06µs        ? ?/sec     1.00     32.9±0.98µs        ? ?/sec
sized_commands_12_bytes/2000_commands               1.01      9.3±0.34µs        ? ?/sec     1.00      9.2±0.22µs        ? ?/sec
sized_commands_12_bytes/4000_commands               1.00     20.8±1.08µs        ? ?/sec     1.04     21.7±1.30µs        ? ?/sec
sized_commands_12_bytes/6000_commands               1.00     31.2±1.49µs        ? ?/sec     1.02     31.8±1.45µs        ? ?/sec
sized_commands_12_bytes/8000_commands               1.00     41.5±2.21µs        ? ?/sec     1.01     42.0±1.97µs        ? ?/sec
sized_commands_512_bytes/2000_commands              1.00     44.8±2.04µs        ? ?/sec     1.02     45.5±2.08µs        ? ?/sec
sized_commands_512_bytes/4000_commands              1.00    95.8±12.73µs        ? ?/sec     1.02    97.3±11.69µs        ? ?/sec
sized_commands_512_bytes/6000_commands              1.08   186.1±48.01µs        ? ?/sec     1.00   172.5±32.22µs        ? ?/sec
sized_commands_512_bytes/8000_commands              1.05   243.7±55.74µs        ? ?/sec     1.00   232.4±51.38µs        ? ?/sec
spawn_commands/2000_entities                        1.01    118.9±9.02µs        ? ?/sec     1.00    117.5±6.86µs        ? ?/sec
spawn_commands/4000_entities                        1.00   238.3±14.48µs        ? ?/sec     1.00   238.1±14.46µs        ? ?/sec
spawn_commands/6000_entities                        1.00   358.0±22.13µs        ? ?/sec     1.00   358.7±21.81µs        ? ?/sec
spawn_commands/8000_entities                        1.01   483.3±19.73µs        ? ?/sec     1.00   480.5±26.13µs        ? ?/sec
spawn_world/10000_entities                          1.00   666.3±75.25µs        ? ?/sec     1.01   671.4±72.43µs        ? ?/sec
spawn_world/1000_entities                           1.02    70.2±10.68µs        ? ?/sec     1.00     69.1±9.14µs        ? ?/sec
spawn_world/100_entities                            1.02      6.9±0.87µs        ? ?/sec     1.00      6.8±0.89µs        ? ?/sec
spawn_world/10_entities                             1.03   666.8±82.85ns        ? ?/sec     1.00   648.3±75.23ns        ? ?/sec
spawn_world/1_entities                              1.01    70.0±10.07ns        ? ?/sec     1.00     69.2±8.72ns        ? ?/sec
world_entity/50000_entities                         1.00     64.0±3.75µs        ? ?/sec     1.00     64.2±4.29µs        ? ?/sec
world_get/50000_entities_sparse                     1.00    121.3±5.57µs        ? ?/sec     1.04    126.6±6.67µs        ? ?/sec
world_get/50000_entities_table                      1.00     99.9±2.49µs        ? ?/sec     1.06    105.6±5.46µs        ? ?/sec
world_query_for_each/50000_entities_sparse          1.00     37.0±0.58µs        ? ?/sec     1.04     38.6±1.55µs        ? ?/sec
world_query_for_each/50000_entities_table           1.01     14.4±0.37µs        ? ?/sec     1.00     14.3±0.25µs        ? ?/sec
world_query_get/50000_entities_sparse               1.00    125.6±2.11µs        ? ?/sec     1.00    125.2±2.28µs        ? ?/sec
world_query_get/50000_entities_sparse_wide          1.01    139.0±3.21µs        ? ?/sec     1.00    137.5±1.55µs        ? ?/sec
world_query_get/50000_entities_table                1.00    115.2±2.45µs        ? ?/sec     1.00    115.2±2.04µs        ? ?/sec
world_query_get/50000_entities_table_wide           1.00    104.7±2.28µs        ? ?/sec     1.08    112.9±2.02µs        ? ?/sec
world_query_iter/50000_entities_sparse              1.09     44.8±4.64µs        ? ?/sec     1.00     41.1±3.11µs        ? ?/sec
world_query_iter/50000_entities_table               1.00     22.8±0.27µs        ? ?/sec     1.00     22.7±0.53µs        ? ?/sec

@alice-i-cecile

Copy link
Copy Markdown
Member

Okay, thanks :) I'm happy to call the benchmarks largely noise. Reducing memory usage has its own value though, so I'm in favor.

@chescock

Copy link
Copy Markdown
Contributor

It might be nice to add some convenience methods to StorageSwitch that do the matches for you. That would make it easier to get right, and would reduce the number of safety comments and checks needed. Something like:

pub fn new(table: impl FnOnce() -> T, sparse_set: impl FnOnce() -> S) -> Self {
    match C::STORAGE_TYPE {
        StorageType::Table => Self {
            table: ManuallyDrop::new(table()),
        },
        StorageType::SparseSet => Self {
            sparse_set: ManuallyDrop::new(sparse_set()),
        },
    }
}

pub fn extract<R>(&self, table: impl FnOnce(T) -> R, sparse_set: impl FnOnce(S) -> R) -> R {
    match C::STORAGE_TYPE {
        StorageType::Table => table(unsafe { *self.table }),
        StorageType::SparseSet => sparse_set(unsafe { *self.sparse_set }),
    }
}

Comment thread crates/bevy_ecs/src/query/fetch.rs Outdated
ItsDoot and others added 2 commits September 22, 2024 14:43
Co-authored-by: Chris Russell <8494645+chescock@users.noreply.github.com>
@ItsDoot

ItsDoot commented Sep 23, 2024

Copy link
Copy Markdown
Contributor Author

It might be nice to add some convenience methods to StorageSwitch that do the matches for you. That would make it easier to get right, and would reduce the number of safety comments and checks needed. Something like:

💯 Very good idea, that works out much better.

@ItsDoot
ItsDoot requested a review from chescock September 27, 2024 01:12
@alice-i-cecile alice-i-cecile added S-Ready-For-Final-Review This PR has been approved by the community. It's ready for a maintainer to consider merging it and removed S-Needs-Review Needs reviewer attention (from anyone!) to move forward labels Sep 27, 2024
@alice-i-cecile
alice-i-cecile added this pull request to the merge queue Sep 27, 2024
Merged via the queue into bevyengine:main with commit a0c722f Sep 27, 2024
@ItsDoot
ItsDoot deleted the fetchmemoryusage branch September 27, 2024 15:11
robtfm pushed a commit to robtfm/bevy that referenced this pull request Oct 4, 2024
…bevyengine#15283)

## Objective

- Adopted bevyengine#6396

## Solution

Same as bevyengine#6396, we use a compile-time checked `StorageSwitch` union type
to select the fetch data based on the component's storage type, saving
>= 8 bytes per component fetch in a given query.

Note: We forego the Query iteration change as it exists in a slightly
different form now on main.

## Testing

- All current tests pass locally.

---------

Co-authored-by: james7132 <contact@jamessliu.com>
Co-authored-by: Chris Russell <8494645+chescock@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-ECS Entities, components, systems, and events C-Performance A change motivated by improving speed, memory usage or compile times D-Unsafe Touches with unsafe code in some way S-Ready-For-Final-Review This PR has been approved by the community. It's ready for a maintainer to consider merging it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants