Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - Start running systems while prepare_systems is running #4919

Closed
wants to merge 18 commits into from

Conversation

james7132
Copy link
Member

Objective

While using the ParallelExecutor, systems do not actually start until prepare_systems completes. In stages where there are large numbers of "empty" systems with very little work to do, this delay adds significant overhead, which can add up over many stages.

Solution

Immediately and synchronously signal the start of systems that can run without dependencies inside prepare_systems instead of waiting for the first executor iteration after prepare_systems completes. Any system that is dependent on them still cannot run until after prepare_systems completes, but there are a large number of unconstrained systems in the base engine where this is a general benefit in almost every case.

Performance

This change was tested against many_foxes in the default configuration. As this change is sensitive to the overhead around scheduling systems, the spans for measuring system timing, system overhead, and system commands were all commented out for these measurements.

The median stage timings between main and this PR are as follows:

stage main this PR
First 75.54 us 61.61 us
LoadAssets 51.05 us 42.32 us
PreUpdate 54.6 us 55.56 us
Update 61.89 us 51.5 us
PostUpdate 7.27 ms 6.71 ms
AssetEvents 47.82 us 35.95 us
Last 39.19 us 37.71 us
reserve_and_flush 57.83 us 48.2 us
Extract 1.41 ms 1.28 ms
Prepare 554.49 us 502.53 us
Queue 216.29 us 207.51 us
Sort 67.03 us 60.99 us
Render 1.73 ms 1.58 ms
Cleanup 33.55 us 30.76 us
Clear Entities 18.56 us 17.05 us
full frame 11.9 ms 10.91 ms

For the first few stages, the benefit is small but cumulative over each. For PostUpdate in particular, this allows parent_update to run while prepare_systems is running, which is required for the animation and transform propagation systems, which dominate the time spent in the stage, but also frontloads the contention as the other "empty" systems are also running while parent_update is running. For Render, where there is just a single large exclusive system, the benefit comes from not waiting on a spuriously scheduled task on the task pool to kick off the system: it's immediately scheduled to run.

@james7132 james7132 added A-ECS Entities, components, systems, and events C-Performance A change motivated by improving speed, memory usage or compile times labels Jun 4, 2022
Copy link
Member

@alice-i-cecile alice-i-cecile left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really like these performance wins; reducing the overhead of running systems is one of the most important areas because it makes doing the right thing compatible with doing the fast thing.

Some cleanup feedback, but the strategy, performance wins and code quality look good to me.

crates/bevy_ecs/src/schedule/executor_parallel.rs Outdated Show resolved Hide resolved
Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
@james7132
Copy link
Member Author

Did some additional benchmarking to verify the results here. The results are remarkably similar to #4740's, which makes sense since both underpin how systems are scheduled onto the scheduler's threads. It overall seem to have an identical effect by decreasing the time between scheduling as system and when it's actually started, even if done via a different method. Both do seem to have a negative impact on when all or most systems are not scheduled to run due to run criteria.

However, since the methodology for both is largely orthogonal, combining both together seems to compound the positive gains, and dampen the losses. Some of the gains of one is wiped out by the other, but the general cases where scheduling dominates have had their times cut in half or more.

Main vs this PR
group                                                    main                                     start-systems-in-prepare
-----                                                    ----                                     ------------------------
added_archetypes/archetype_count/100                     6.57  1294.4±47.68µs        ? ?/sec      1.00   197.1±11.79µs        ? ?/sec
added_archetypes/archetype_count/1000                    2.85  1957.3±133.68µs        ? ?/sec     1.00   685.8±31.10µs        ? ?/sec
added_archetypes/archetype_count/10000                   1.23     17.1±1.46ms        ? ?/sec      1.00     14.0±1.12ms        ? ?/sec
added_archetypes/archetype_count/200                     5.33  1335.0±33.66µs        ? ?/sec      1.00   250.6±20.16µs        ? ?/sec
added_archetypes/archetype_count/2000                    3.02      4.1±0.21ms        ? ?/sec      1.00  1357.5±27.98µs        ? ?/sec
added_archetypes/archetype_count/500                     3.97  1585.0±71.94µs        ? ?/sec      1.00   399.0±42.57µs        ? ?/sec
added_archetypes/archetype_count/5000                    1.87      8.6±0.98ms        ? ?/sec      1.00      4.6±0.52ms        ? ?/sec
busy_systems/01x_entities_03_systems                     1.22     40.4±2.52µs        ? ?/sec      1.00     33.2±1.00µs        ? ?/sec
busy_systems/01x_entities_06_systems                     1.23     79.0±3.66µs        ? ?/sec      1.00     64.4±1.80µs        ? ?/sec
busy_systems/01x_entities_09_systems                     1.25    125.5±6.04µs        ? ?/sec      1.00    100.2±3.08µs        ? ?/sec
busy_systems/01x_entities_12_systems                     1.23    153.4±7.77µs        ? ?/sec      1.00    125.1±4.80µs        ? ?/sec
busy_systems/01x_entities_15_systems                     1.19    187.9±6.60µs        ? ?/sec      1.00    157.4±7.33µs        ? ?/sec
busy_systems/02x_entities_03_systems                     1.14     74.4±3.74µs        ? ?/sec      1.00     65.1±2.69µs        ? ?/sec
busy_systems/02x_entities_06_systems                     1.13    140.7±8.57µs        ? ?/sec      1.00    124.8±4.44µs        ? ?/sec
busy_systems/02x_entities_09_systems                     1.28    217.6±8.97µs        ? ?/sec      1.00    170.4±3.59µs        ? ?/sec
busy_systems/02x_entities_12_systems                     1.18   278.7±11.11µs        ? ?/sec      1.00    235.6±4.93µs        ? ?/sec
busy_systems/02x_entities_15_systems                     1.17   340.7±20.27µs        ? ?/sec      1.00    291.8±6.98µs        ? ?/sec
busy_systems/03x_entities_03_systems                     1.18    105.7±6.43µs        ? ?/sec      1.00     89.9±3.76µs        ? ?/sec
busy_systems/03x_entities_06_systems                     1.32   224.8±13.17µs        ? ?/sec      1.00    170.3±5.40µs        ? ?/sec
busy_systems/03x_entities_09_systems                     1.28   327.2±13.83µs        ? ?/sec      1.00    254.9±9.43µs        ? ?/sec
busy_systems/03x_entities_12_systems                     1.31   420.3±15.97µs        ? ?/sec      1.00   321.4±11.64µs        ? ?/sec
busy_systems/03x_entities_15_systems                     1.18   484.9±18.26µs        ? ?/sec      1.00    410.8±9.44µs        ? ?/sec
busy_systems/04x_entities_03_systems                     1.12    135.7±8.19µs        ? ?/sec      1.00    120.8±8.46µs        ? ?/sec
busy_systems/04x_entities_06_systems                     1.31   294.1±11.13µs        ? ?/sec      1.00   224.9±21.35µs        ? ?/sec
busy_systems/04x_entities_09_systems                     1.24   434.4±19.06µs        ? ?/sec      1.00   349.9±13.08µs        ? ?/sec
busy_systems/04x_entities_12_systems                     1.21   537.1±31.11µs        ? ?/sec      1.00   442.3±15.26µs        ? ?/sec
busy_systems/04x_entities_15_systems                     1.14   625.7±30.09µs        ? ?/sec      1.00   548.8±28.48µs        ? ?/sec
busy_systems/05x_entities_03_systems                     1.29   176.1±12.71µs        ? ?/sec      1.00    136.2±3.42µs        ? ?/sec
busy_systems/05x_entities_06_systems                     1.25   352.2±26.54µs        ? ?/sec      1.00    282.3±8.92µs        ? ?/sec
busy_systems/05x_entities_09_systems                     1.35   547.8±22.79µs        ? ?/sec      1.00   407.2±10.85µs        ? ?/sec
busy_systems/05x_entities_12_systems                     1.23   683.8±48.92µs        ? ?/sec      1.00   557.8±16.50µs        ? ?/sec
busy_systems/05x_entities_15_systems                     1.25   867.3±42.16µs        ? ?/sec      1.00   693.9±29.26µs        ? ?/sec
contrived/01x_entities_03_systems                        1.31     28.2±0.70µs        ? ?/sec      1.00     21.6±1.47µs        ? ?/sec
contrived/01x_entities_06_systems                        1.35     52.6±2.18µs        ? ?/sec      1.00     38.9±2.50µs        ? ?/sec
contrived/01x_entities_09_systems                        1.26     78.4±4.73µs        ? ?/sec      1.00     62.4±3.38µs        ? ?/sec
contrived/01x_entities_12_systems                        1.26    101.5±6.61µs        ? ?/sec      1.00     80.8±3.68µs        ? ?/sec
contrived/01x_entities_15_systems                        1.25    125.0±5.25µs        ? ?/sec      1.00    100.3±5.92µs        ? ?/sec
contrived/02x_entities_03_systems                        1.16     41.6±1.53µs        ? ?/sec      1.00     36.0±2.72µs        ? ?/sec
contrived/02x_entities_06_systems                        1.19     81.1±2.24µs        ? ?/sec      1.00     68.1±7.60µs        ? ?/sec
contrived/02x_entities_09_systems                        1.17    116.2±5.09µs        ? ?/sec      1.00     99.4±8.88µs        ? ?/sec
contrived/02x_entities_12_systems                        1.14    149.3±4.09µs        ? ?/sec      1.00    130.5±9.24µs        ? ?/sec
contrived/02x_entities_15_systems                        1.16    191.2±8.23µs        ? ?/sec      1.00    164.7±9.83µs        ? ?/sec
contrived/03x_entities_03_systems                        1.19     56.3±2.24µs        ? ?/sec      1.00     47.2±3.06µs        ? ?/sec
contrived/03x_entities_06_systems                        1.29    111.7±5.10µs        ? ?/sec      1.00     86.6±5.41µs        ? ?/sec
contrived/03x_entities_09_systems                        1.12    149.9±5.70µs        ? ?/sec      1.00    134.2±5.04µs        ? ?/sec
contrived/03x_entities_12_systems                        1.12    198.6±7.92µs        ? ?/sec      1.00    178.0±8.28µs        ? ?/sec
contrived/03x_entities_15_systems                        1.08    242.0±9.53µs        ? ?/sec      1.00   223.2±12.75µs        ? ?/sec
contrived/04x_entities_03_systems                        1.11     67.7±3.02µs        ? ?/sec      1.00     60.8±6.56µs        ? ?/sec
contrived/04x_entities_06_systems                        1.13    136.9±6.27µs        ? ?/sec      1.00    121.0±6.35µs        ? ?/sec
contrived/04x_entities_09_systems                        1.06    190.6±5.42µs        ? ?/sec      1.00   180.4±13.79µs        ? ?/sec
contrived/04x_entities_12_systems                        1.04    238.8±6.75µs        ? ?/sec      1.00    230.5±8.08µs        ? ?/sec
contrived/04x_entities_15_systems                        1.05    290.7±8.65µs        ? ?/sec      1.00    276.2±9.80µs        ? ?/sec
contrived/05x_entities_03_systems                        1.27     88.5±3.29µs        ? ?/sec      1.00     69.6±6.22µs        ? ?/sec
contrived/05x_entities_06_systems                        1.14    158.7±5.37µs        ? ?/sec      1.00    139.7±8.23µs        ? ?/sec
contrived/05x_entities_09_systems                        1.08   229.2±13.21µs        ? ?/sec      1.00    213.1±7.23µs        ? ?/sec
contrived/05x_entities_12_systems                        1.05    285.3±6.02µs        ? ?/sec      1.00   272.1±13.59µs        ? ?/sec
contrived/05x_entities_15_systems                        1.07   345.2±14.09µs        ? ?/sec      1.00   323.9±10.80µs        ? ?/sec
empty_commands/0_entities                                1.00      5.2±0.06ns        ? ?/sec      1.00      5.2±0.14ns        ? ?/sec
empty_systems/000_systems                                118.90     2.6±0.16µs        ? ?/sec     1.00     21.8±0.29ns        ? ?/sec
empty_systems/001_systems                                1.16      4.3±0.37µs        ? ?/sec      1.00      3.7±0.22µs        ? ?/sec
empty_systems/002_systems                                1.14      5.8±0.15µs        ? ?/sec      1.00      5.1±0.40µs        ? ?/sec
empty_systems/003_systems                                1.25      7.2±0.22µs        ? ?/sec      1.00      5.8±0.32µs        ? ?/sec
empty_systems/004_systems                                1.17      8.2±0.33µs        ? ?/sec      1.00      7.0±0.61µs        ? ?/sec
empty_systems/005_systems                                1.06      9.1±0.35µs        ? ?/sec      1.00      8.6±0.85µs        ? ?/sec
empty_systems/010_systems                                1.08     13.8±0.67µs        ? ?/sec      1.00     12.9±1.57µs        ? ?/sec
empty_systems/015_systems                                1.09     19.3±1.23µs        ? ?/sec      1.00     17.8±1.39µs        ? ?/sec
empty_systems/020_systems                                1.24     25.1±1.17µs        ? ?/sec      1.00     20.2±1.65µs        ? ?/sec
empty_systems/025_systems                                1.18     28.6±1.05µs        ? ?/sec      1.00     24.3±1.61µs        ? ?/sec
empty_systems/030_systems                                1.18     33.6±1.15µs        ? ?/sec      1.00     28.4±1.91µs        ? ?/sec
empty_systems/035_systems                                1.23     39.1±1.45µs        ? ?/sec      1.00     31.8±2.01µs        ? ?/sec
empty_systems/040_systems                                1.23     43.4±1.68µs        ? ?/sec      1.00     35.4±1.16µs        ? ?/sec
empty_systems/045_systems                                1.20     47.3±2.25µs        ? ?/sec      1.00     39.5±2.02µs        ? ?/sec
empty_systems/050_systems                                1.23     52.1±2.34µs        ? ?/sec      1.00     42.3±1.77µs        ? ?/sec
empty_systems/055_systems                                1.22     57.2±2.15µs        ? ?/sec      1.00     47.0±1.77µs        ? ?/sec
empty_systems/060_systems                                1.22     60.6±1.82µs        ? ?/sec      1.00     49.6±1.69µs        ? ?/sec
empty_systems/065_systems                                1.18     64.1±2.33µs        ? ?/sec      1.00     54.3±2.17µs        ? ?/sec
empty_systems/070_systems                                1.21     70.9±2.74µs        ? ?/sec      1.00     58.6±2.45µs        ? ?/sec
empty_systems/075_systems                                1.20     75.8±2.61µs        ? ?/sec      1.00     63.0±2.49µs        ? ?/sec
empty_systems/080_systems                                1.15     79.0±3.53µs        ? ?/sec      1.00     68.6±2.85µs        ? ?/sec
empty_systems/085_systems                                1.14     84.5±2.59µs        ? ?/sec      1.00     73.9±2.54µs        ? ?/sec
empty_systems/090_systems                                1.09     87.8±3.49µs        ? ?/sec      1.00     80.6±4.74µs        ? ?/sec
empty_systems/095_systems                                1.09     95.0±3.56µs        ? ?/sec      1.00     87.2±4.11µs        ? ?/sec
empty_systems/100_systems                                1.11     99.4±4.07µs        ? ?/sec      1.00     89.3±3.56µs        ? ?/sec
no_archetypes/system_count/0                             69.67 1523.0±314.34ns        ? ?/sec     1.00     21.9±0.93ns        ? ?/sec
no_archetypes/system_count/100                           1.00     99.5±5.50µs        ? ?/sec      1.11    110.3±6.33µs        ? ?/sec
no_archetypes/system_count/20                            1.08     24.3±1.58µs        ? ?/sec      1.00     22.4±0.95µs        ? ?/sec
no_archetypes/system_count/40                            1.00     41.4±2.24µs        ? ?/sec      1.02     42.4±1.00µs        ? ?/sec
no_archetypes/system_count/60                            1.02     64.0±3.55µs        ? ?/sec      1.00     62.9±1.96µs        ? ?/sec
no_archetypes/system_count/80                            1.00     81.1±4.90µs        ? ?/sec      1.04     84.3±2.55µs        ? ?/sec
run_criteria/no/001_systems                              1.00  1429.0±128.56ns        ? ?/sec     2.02      2.9±0.20µs        ? ?/sec
run_criteria/no/006_systems                              1.00  1880.9±138.02ns        ? ?/sec     1.82      3.4±0.35µs        ? ?/sec
run_criteria/no/011_systems                              1.00  1567.0±52.07ns        ? ?/sec      2.95      4.6±1.19µs        ? ?/sec
run_criteria/no/016_systems                              1.00  1626.9±141.83ns        ? ?/sec     3.31      5.4±1.91µs        ? ?/sec
run_criteria/no/021_systems                              1.00  1700.6±43.36ns        ? ?/sec      3.61      6.1±3.50µs        ? ?/sec
run_criteria/no/026_systems                              1.00  1852.0±46.34ns        ? ?/sec      4.43      8.2±3.62µs        ? ?/sec
run_criteria/no/031_systems                              1.00  1970.4±65.72ns        ? ?/sec      5.55     10.9±5.03µs        ? ?/sec
run_criteria/no/036_systems                              1.00      2.1±0.08µs        ? ?/sec      5.83     12.5±5.06µs        ? ?/sec
run_criteria/no/041_systems                              1.00      2.3±0.10µs        ? ?/sec      5.09     11.9±5.38µs        ? ?/sec
run_criteria/no/046_systems                              1.00      2.4±0.08µs        ? ?/sec      5.16     12.6±5.27µs        ? ?/sec
run_criteria/no/051_systems                              1.00      3.0±0.52µs        ? ?/sec      3.61     10.9±5.20µs        ? ?/sec
run_criteria/no/056_systems                              1.00      3.6±0.79µs        ? ?/sec      2.80     10.2±5.44µs        ? ?/sec
run_criteria/no/061_systems                              1.00      4.3±1.09µs        ? ?/sec      2.84     12.3±5.16µs        ? ?/sec
run_criteria/no/066_systems                              1.00      5.3±1.11µs        ? ?/sec      3.46     18.2±4.25µs        ? ?/sec
run_criteria/no/071_systems                              1.00      4.6±1.34µs        ? ?/sec      3.71     17.2±4.69µs        ? ?/sec
run_criteria/no/076_systems                              1.00      5.9±1.78µs        ? ?/sec      3.15     18.7±3.31µs        ? ?/sec
run_criteria/no/081_systems                              1.00      7.5±2.08µs        ? ?/sec      2.31     17.4±4.45µs        ? ?/sec
run_criteria/no/086_systems                              1.00     11.0±2.36µs        ? ?/sec      1.73     19.0±4.34µs        ? ?/sec
run_criteria/no/091_systems                              1.00     12.3±1.90µs        ? ?/sec      1.59     19.6±4.11µs        ? ?/sec
run_criteria/no/096_systems                              1.00     13.0±1.64µs        ? ?/sec      1.63     21.1±2.74µs        ? ?/sec
run_criteria/no/101_systems                              1.00     15.5±1.61µs        ? ?/sec      1.34     20.7±3.74µs        ? ?/sec
run_criteria/no_with_labels/001_systems                  1.00  1342.6±55.58ns        ? ?/sec      2.02      2.7±0.10µs        ? ?/sec
run_criteria/no_with_labels/006_systems                  1.00  1840.7±158.89ns        ? ?/sec     1.64      3.0±0.38µs        ? ?/sec
run_criteria/no_with_labels/011_systems                  1.00  1561.0±101.44ns        ? ?/sec     1.77      2.8±0.56µs        ? ?/sec
run_criteria/no_with_labels/016_systems                  1.00  1450.3±69.17ns        ? ?/sec      2.08      3.0±0.53µs        ? ?/sec
run_criteria/no_with_labels/021_systems                  1.00  1790.6±140.99ns        ? ?/sec     1.66      3.0±0.59µs        ? ?/sec
run_criteria/no_with_labels/026_systems                  1.00  1691.0±39.38ns        ? ?/sec      2.18      3.7±0.70µs        ? ?/sec
run_criteria/no_with_labels/031_systems                  1.00  1806.5±106.99ns        ? ?/sec     3.32      6.0±2.32µs        ? ?/sec
run_criteria/no_with_labels/036_systems                  1.00      2.0±0.12µs        ? ?/sec      3.62      7.4±4.28µs        ? ?/sec
run_criteria/no_with_labels/041_systems                  1.00      2.2±0.12µs        ? ?/sec      5.11     11.1±3.83µs        ? ?/sec
run_criteria/no_with_labels/046_systems                  1.00      2.3±0.10µs        ? ?/sec      2.95      6.7±3.43µs        ? ?/sec
run_criteria/no_with_labels/051_systems                  1.00      2.2±0.09µs        ? ?/sec      2.68      5.9±3.59µs        ? ?/sec
run_criteria/no_with_labels/056_systems                  1.00      2.6±0.41µs        ? ?/sec      1.93      5.1±2.97µs        ? ?/sec
run_criteria/no_with_labels/061_systems                  1.00      2.7±0.27µs        ? ?/sec      2.03      5.5±3.39µs        ? ?/sec
run_criteria/no_with_labels/066_systems                  1.00      2.8±0.26µs        ? ?/sec      2.26      6.3±3.17µs        ? ?/sec
run_criteria/no_with_labels/071_systems                  1.00      3.2±0.37µs        ? ?/sec      1.98      6.4±4.49µs        ? ?/sec
run_criteria/no_with_labels/076_systems                  1.00      4.1±0.72µs        ? ?/sec      1.62      6.6±2.98µs        ? ?/sec
run_criteria/no_with_labels/081_systems                  1.00      4.7±0.94µs        ? ?/sec      1.51      7.1±3.08µs        ? ?/sec
run_criteria/no_with_labels/086_systems                  1.00      5.3±1.62µs        ? ?/sec      1.26      6.7±4.14µs        ? ?/sec
run_criteria/no_with_labels/091_systems                  1.00      5.6±1.43µs        ? ?/sec      1.53      8.5±3.81µs        ? ?/sec
run_criteria/no_with_labels/096_systems                  1.00      6.3±1.65µs        ? ?/sec      1.73     11.0±4.84µs        ? ?/sec
run_criteria/no_with_labels/101_systems                  1.00      7.5±2.31µs        ? ?/sec      1.50     11.2±5.86µs        ? ?/sec
run_criteria/yes/001_systems                             1.93      5.9±0.42µs        ? ?/sec      1.00      3.1±0.11µs        ? ?/sec
run_criteria/yes/006_systems                             1.47     12.3±1.20µs        ? ?/sec      1.00      8.3±0.54µs        ? ?/sec
run_criteria/yes/011_systems                             1.31     17.9±1.65µs        ? ?/sec      1.00     13.7±0.64µs        ? ?/sec
run_criteria/yes/016_systems                             1.25     23.4±2.54µs        ? ?/sec      1.00     18.7±1.06µs        ? ?/sec
run_criteria/yes/021_systems                             1.16     27.2±2.86µs        ? ?/sec      1.00     23.5±1.27µs        ? ?/sec
run_criteria/yes/026_systems                             1.17     33.7±2.31µs        ? ?/sec      1.00     28.8±1.13µs        ? ?/sec
run_criteria/yes/031_systems                             1.15     38.5±2.82µs        ? ?/sec      1.00     33.6±2.27µs        ? ?/sec
run_criteria/yes/036_systems                             1.08     41.5±3.91µs        ? ?/sec      1.00     38.5±1.42µs        ? ?/sec
run_criteria/yes/041_systems                             1.10     47.3±4.65µs        ? ?/sec      1.00     43.1±2.01µs        ? ?/sec
run_criteria/yes/046_systems                             1.09     53.2±3.36µs        ? ?/sec      1.00     49.0±2.32µs        ? ?/sec
run_criteria/yes/051_systems                             1.03     55.8±4.93µs        ? ?/sec      1.00     54.2±1.67µs        ? ?/sec
run_criteria/yes/056_systems                             1.03     60.8±3.97µs        ? ?/sec      1.00     58.7±1.95µs        ? ?/sec
run_criteria/yes/061_systems                             1.00     62.8±5.42µs        ? ?/sec      1.01     63.7±2.14µs        ? ?/sec
run_criteria/yes/066_systems                             1.00     66.9±7.21µs        ? ?/sec      1.02     68.2±2.85µs        ? ?/sec
run_criteria/yes/071_systems                             1.00     72.7±6.34µs        ? ?/sec      1.01     73.1±3.83µs        ? ?/sec
run_criteria/yes/076_systems                             1.00     74.2±6.22µs        ? ?/sec      1.06     78.3±3.38µs        ? ?/sec
run_criteria/yes/081_systems                             1.00     79.1±5.81µs        ? ?/sec      1.01     80.2±4.09µs        ? ?/sec
run_criteria/yes/086_systems                             1.00     87.6±5.72µs        ? ?/sec      1.01     88.9±3.53µs        ? ?/sec
run_criteria/yes/091_systems                             1.00     86.5±6.30µs        ? ?/sec      1.07     92.7±4.81µs        ? ?/sec
run_criteria/yes/096_systems                             1.00     90.0±5.66µs        ? ?/sec      1.12    100.7±4.10µs        ? ?/sec
run_criteria/yes/101_systems                             1.00     96.6±8.29µs        ? ?/sec      1.16    111.7±4.51µs        ? ?/sec
run_criteria/yes_using_query/001_systems                 2.09      6.2±0.22µs        ? ?/sec      1.00      3.0±0.18µs        ? ?/sec
run_criteria/yes_using_query/006_systems                 1.47     12.8±0.38µs        ? ?/sec      1.00      8.7±0.47µs        ? ?/sec
run_criteria/yes_using_query/011_systems                 1.35     18.4±1.22µs        ? ?/sec      1.00     13.7±0.75µs        ? ?/sec
run_criteria/yes_using_query/016_systems                 1.27     24.0±2.52µs        ? ?/sec      1.00     18.9±1.05µs        ? ?/sec
run_criteria/yes_using_query/021_systems                 1.16     28.4±2.53µs        ? ?/sec      1.00     24.5±1.25µs        ? ?/sec
run_criteria/yes_using_query/026_systems                 1.13     33.3±2.84µs        ? ?/sec      1.00     29.4±1.25µs        ? ?/sec
run_criteria/yes_using_query/031_systems                 1.16     38.7±1.96µs        ? ?/sec      1.00     33.3±1.66µs        ? ?/sec
run_criteria/yes_using_query/036_systems                 1.13     42.7±2.93µs        ? ?/sec      1.00     37.7±1.78µs        ? ?/sec
run_criteria/yes_using_query/041_systems                 1.12     48.1±3.20µs        ? ?/sec      1.00     43.1±1.79µs        ? ?/sec
run_criteria/yes_using_query/046_systems                 1.09     51.1±3.71µs        ? ?/sec      1.00     47.0±2.49µs        ? ?/sec
run_criteria/yes_using_query/051_systems                 1.12     57.0±4.18µs        ? ?/sec      1.00     51.0±2.96µs        ? ?/sec
run_criteria/yes_using_query/056_systems                 1.01     58.6±5.94µs        ? ?/sec      1.00     57.8±2.88µs        ? ?/sec
run_criteria/yes_using_query/061_systems                 1.02     62.6±5.36µs        ? ?/sec      1.00     61.4±3.31µs        ? ?/sec
run_criteria/yes_using_query/066_systems                 1.06     69.6±4.94µs        ? ?/sec      1.00     65.5±3.31µs        ? ?/sec
run_criteria/yes_using_query/071_systems                 1.03     73.0±6.70µs        ? ?/sec      1.00     71.0±3.59µs        ? ?/sec
run_criteria/yes_using_query/076_systems                 1.00     76.1±8.62µs        ? ?/sec      1.02     77.4±3.64µs        ? ?/sec
run_criteria/yes_using_query/081_systems                 1.00     81.9±7.86µs        ? ?/sec      1.00     81.6±4.46µs        ? ?/sec
run_criteria/yes_using_query/086_systems                 1.00     82.8±8.81µs        ? ?/sec      1.04     86.5±6.29µs        ? ?/sec
run_criteria/yes_using_query/091_systems                 1.00    86.8±10.23µs        ? ?/sec      1.12     97.4±6.50µs        ? ?/sec
run_criteria/yes_using_query/096_systems                 1.00     90.9±6.76µs        ? ?/sec      1.13    102.4±7.02µs        ? ?/sec
run_criteria/yes_using_query/101_systems                 1.00     94.0±8.51µs        ? ?/sec      1.19    111.6±5.54µs        ? ?/sec
run_criteria/yes_using_resource/001_systems              1.84      6.0±0.29µs        ? ?/sec      1.00      3.2±0.29µs        ? ?/sec
run_criteria/yes_using_resource/006_systems              1.45     12.2±0.74µs        ? ?/sec      1.00      8.4±0.36µs        ? ?/sec
run_criteria/yes_using_resource/011_systems              1.33     17.8±1.95µs        ? ?/sec      1.00     13.4±0.82µs        ? ?/sec
run_criteria/yes_using_resource/016_systems              1.24     23.5±2.12µs        ? ?/sec      1.00     18.9±0.91µs        ? ?/sec
run_criteria/yes_using_resource/021_systems              1.15     27.8±2.66µs        ? ?/sec      1.00     24.2±1.42µs        ? ?/sec
run_criteria/yes_using_resource/026_systems              1.14     33.5±2.79µs        ? ?/sec      1.00     29.4±1.38µs        ? ?/sec
run_criteria/yes_using_resource/031_systems              1.12     38.4±3.51µs        ? ?/sec      1.00     34.3±1.53µs        ? ?/sec
run_criteria/yes_using_resource/036_systems              1.06     42.2±3.24µs        ? ?/sec      1.00     39.8±1.63µs        ? ?/sec
run_criteria/yes_using_resource/041_systems              1.09     47.0±3.85µs        ? ?/sec      1.00     43.2±1.86µs        ? ?/sec
run_criteria/yes_using_resource/046_systems              1.07     51.3±3.60µs        ? ?/sec      1.00     48.1±1.99µs        ? ?/sec
run_criteria/yes_using_resource/051_systems              1.04     54.7±5.04µs        ? ?/sec      1.00     52.7±2.18µs        ? ?/sec
run_criteria/yes_using_resource/056_systems              1.00     59.9±6.51µs        ? ?/sec      1.03     61.9±2.41µs        ? ?/sec
run_criteria/yes_using_resource/061_systems              1.02     62.6±7.94µs        ? ?/sec      1.00     61.7±4.63µs        ? ?/sec
run_criteria/yes_using_resource/066_systems              1.01     67.7±5.80µs        ? ?/sec      1.00     67.3±3.26µs        ? ?/sec
run_criteria/yes_using_resource/071_systems              1.00     71.4±5.93µs        ? ?/sec      1.04     74.6±2.89µs        ? ?/sec
run_criteria/yes_using_resource/076_systems              1.00     80.5±7.30µs        ? ?/sec      1.01     81.3±3.47µs        ? ?/sec
run_criteria/yes_using_resource/081_systems              1.00     79.6±5.45µs        ? ?/sec      1.07     84.9±4.12µs        ? ?/sec
run_criteria/yes_using_resource/086_systems              1.00     84.9±6.54µs        ? ?/sec      1.06     89.7±4.26µs        ? ?/sec
run_criteria/yes_using_resource/091_systems              1.00     85.3±6.39µs        ? ?/sec      1.15     98.3±4.93µs        ? ?/sec
run_criteria/yes_using_resource/096_systems              1.00     89.6±7.13µs        ? ?/sec      1.14    102.5±7.06µs        ? ?/sec
run_criteria/yes_using_resource/101_systems              1.00     92.3±5.49µs        ? ?/sec      1.24    114.9±6.95µs        ? ?/sec
run_criteria/yes_with_labels/001_systems                 1.84      5.9±0.17µs        ? ?/sec      1.00      3.2±0.15µs        ? ?/sec
run_criteria/yes_with_labels/006_systems                 1.34     11.0±0.69µs        ? ?/sec      1.00      8.2±0.19µs        ? ?/sec
run_criteria/yes_with_labels/011_systems                 1.21     16.2±1.53µs        ? ?/sec      1.00     13.4±0.68µs        ? ?/sec
run_criteria/yes_with_labels/016_systems                 1.10     20.9±1.89µs        ? ?/sec      1.00     19.1±0.89µs        ? ?/sec
run_criteria/yes_with_labels/021_systems                 1.01     25.2±2.47µs        ? ?/sec      1.00     24.9±1.02µs        ? ?/sec
run_criteria/yes_with_labels/026_systems                 1.00     29.8±1.84µs        ? ?/sec      1.00     29.9±1.05µs        ? ?/sec
run_criteria/yes_with_labels/031_systems                 1.00     33.2±2.60µs        ? ?/sec      1.05     34.9±1.87µs        ? ?/sec
run_criteria/yes_with_labels/036_systems                 1.00     37.4±2.68µs        ? ?/sec      1.07     40.0±1.44µs        ? ?/sec
run_criteria/yes_with_labels/041_systems                 1.00     41.0±2.71µs        ? ?/sec      1.08     44.1±1.55µs        ? ?/sec
run_criteria/yes_with_labels/046_systems                 1.00     44.8±2.43µs        ? ?/sec      1.10     49.2±1.72µs        ? ?/sec
run_criteria/yes_with_labels/051_systems                 1.00     49.4±2.97µs        ? ?/sec      1.08     53.4±1.82µs        ? ?/sec
run_criteria/yes_with_labels/056_systems                 1.00     53.9±3.28µs        ? ?/sec      1.11     59.6±2.01µs        ? ?/sec
run_criteria/yes_with_labels/061_systems                 1.00     56.6±3.12µs        ? ?/sec      1.13     63.9±2.56µs        ? ?/sec
run_criteria/yes_with_labels/066_systems                 1.00     64.0±4.34µs        ? ?/sec      1.10     70.3±2.60µs        ? ?/sec
run_criteria/yes_with_labels/071_systems                 1.00     65.6±5.71µs        ? ?/sec      1.12     73.6±2.70µs        ? ?/sec
run_criteria/yes_with_labels/076_systems                 1.00     67.0±5.02µs        ? ?/sec      1.18     79.2±3.82µs        ? ?/sec
run_criteria/yes_with_labels/081_systems                 1.00     71.8±4.10µs        ? ?/sec      1.20     86.3±3.92µs        ? ?/sec
run_criteria/yes_with_labels/086_systems                 1.00     75.8±4.21µs        ? ?/sec      1.21     91.6±4.59µs        ? ?/sec
run_criteria/yes_with_labels/091_systems                 1.00     78.4±4.85µs        ? ?/sec      1.26     99.0±4.03µs        ? ?/sec
run_criteria/yes_with_labels/096_systems                 1.00     81.8±6.04µs        ? ?/sec      1.26    102.9±3.44µs        ? ?/sec
run_criteria/yes_with_labels/101_systems                 1.00     85.5±9.67µs        ? ?/sec      1.31    112.3±4.85µs        ? ?/sec
schedule/base                                            1.32     38.1±2.98µs        ? ?/sec      1.00     29.0±2.55µs        ? ?/sec
Internalization vs this PR vs Both Together
group                                                    no-active                                start-and-internalization                start-systems-in-prepare
-----                                                    ---------                                -------------------------                ------------------------
added_archetypes/archetype_count/100                     1.45    155.9±9.91µs        ? ?/sec      1.00    107.9±5.44µs        ? ?/sec      1.83   197.1±11.79µs        ? ?/sec
added_archetypes/archetype_count/1000                    1.02   694.9±10.82µs        ? ?/sec      1.00   681.9±33.90µs        ? ?/sec      1.01   685.8±31.10µs        ? ?/sec
added_archetypes/archetype_count/10000                   1.00     11.3±1.35ms        ? ?/sec      1.24     14.0±1.12ms        ? ?/sec      1.23     14.0±1.12ms        ? ?/sec
added_archetypes/archetype_count/200                     1.26    205.4±7.75µs        ? ?/sec      1.00    163.2±4.59µs        ? ?/sec      1.54   250.6±20.16µs        ? ?/sec
added_archetypes/archetype_count/2000                    1.00  1359.5±28.68µs        ? ?/sec      1.04  1410.3±69.25µs        ? ?/sec      1.00  1357.5±27.98µs        ? ?/sec
added_archetypes/archetype_count/500                     1.09   385.6±12.41µs        ? ?/sec      1.00    353.9±8.52µs        ? ?/sec      1.13   399.0±42.57µs        ? ?/sec
added_archetypes/archetype_count/5000                    1.00      3.7±0.18ms        ? ?/sec      1.40      5.1±0.61ms        ? ?/sec      1.25      4.6±0.52ms        ? ?/sec
busy_systems/01x_entities_03_systems                     1.19     35.5±2.31µs        ? ?/sec      1.00     29.8±0.97µs        ? ?/sec      1.11     33.2±1.00µs        ? ?/sec
busy_systems/01x_entities_06_systems                     1.03     66.1±3.30µs        ? ?/sec      1.22     78.5±1.61µs        ? ?/sec      1.00     64.4±1.80µs        ? ?/sec
busy_systems/01x_entities_09_systems                     1.00     96.9±5.60µs        ? ?/sec      1.21    117.2±2.80µs        ? ?/sec      1.03    100.2±3.08µs        ? ?/sec
busy_systems/01x_entities_12_systems                     1.04    129.5±6.13µs        ? ?/sec      1.21    150.9±5.58µs        ? ?/sec      1.00    125.1±4.80µs        ? ?/sec
busy_systems/01x_entities_15_systems                     1.03    162.6±8.61µs        ? ?/sec      1.24    194.8±7.09µs        ? ?/sec      1.00    157.4±7.33µs        ? ?/sec
busy_systems/02x_entities_03_systems                     1.14     65.1±3.38µs        ? ?/sec      1.00     57.3±5.62µs        ? ?/sec      1.14     65.1±2.69µs        ? ?/sec
busy_systems/02x_entities_06_systems                     1.00    123.7±5.12µs        ? ?/sec      1.05    129.9±6.40µs        ? ?/sec      1.01    124.8±4.44µs        ? ?/sec
busy_systems/02x_entities_09_systems                     1.04    176.7±7.50µs        ? ?/sec      1.34   227.7±17.53µs        ? ?/sec      1.00    170.4±3.59µs        ? ?/sec
busy_systems/02x_entities_12_systems                     1.01    237.0±9.99µs        ? ?/sec      1.28   301.8±14.38µs        ? ?/sec      1.00    235.6±4.93µs        ? ?/sec
busy_systems/02x_entities_15_systems                     1.02   296.2±15.90µs        ? ?/sec      1.20   351.4±14.16µs        ? ?/sec      1.00    291.8±6.98µs        ? ?/sec
busy_systems/03x_entities_03_systems                     1.02     91.8±5.73µs        ? ?/sec      1.22   109.5±11.64µs        ? ?/sec      1.00     89.9±3.76µs        ? ?/sec
busy_systems/03x_entities_06_systems                     1.02    174.5±7.36µs        ? ?/sec      1.08   184.4±10.85µs        ? ?/sec      1.00    170.3±5.40µs        ? ?/sec
busy_systems/03x_entities_09_systems                     1.00   252.1±14.62µs        ? ?/sec      1.24   311.6±15.62µs        ? ?/sec      1.01    254.9±9.43µs        ? ?/sec
busy_systems/03x_entities_12_systems                     1.03   329.8±13.39µs        ? ?/sec      1.32   424.5±21.19µs        ? ?/sec      1.00   321.4±11.64µs        ? ?/sec
busy_systems/03x_entities_15_systems                     1.02   420.4±23.64µs        ? ?/sec      1.14   470.1±13.92µs        ? ?/sec      1.00    410.8±9.44µs        ? ?/sec
busy_systems/04x_entities_03_systems                     1.22    129.0±7.04µs        ? ?/sec      1.00    106.1±6.32µs        ? ?/sec      1.14    120.8±8.46µs        ? ?/sec
busy_systems/04x_entities_06_systems                     1.02   228.4±11.49µs        ? ?/sec      1.09   246.2±19.85µs        ? ?/sec      1.00   224.9±21.35µs        ? ?/sec
busy_systems/04x_entities_09_systems                     1.00   347.0±33.66µs        ? ?/sec      1.22   423.7±36.26µs        ? ?/sec      1.01   349.9±13.08µs        ? ?/sec
busy_systems/04x_entities_12_systems                     1.00   438.9±15.06µs        ? ?/sec      1.29   564.6±39.19µs        ? ?/sec      1.01   442.3±15.26µs        ? ?/sec
busy_systems/04x_entities_15_systems                     1.00   548.6±17.30µs        ? ?/sec      1.16   634.0±27.91µs        ? ?/sec      1.00   548.8±28.48µs        ? ?/sec
busy_systems/05x_entities_03_systems                     1.06    144.2±5.23µs        ? ?/sec      1.27   173.5±20.44µs        ? ?/sec      1.00    136.2±3.42µs        ? ?/sec
busy_systems/05x_entities_06_systems                     1.01   284.4±13.21µs        ? ?/sec      1.19   334.8±35.01µs        ? ?/sec      1.00    282.3±8.92µs        ? ?/sec
busy_systems/05x_entities_09_systems                     1.05   425.6±22.15µs        ? ?/sec      1.31   534.8±23.93µs        ? ?/sec      1.00   407.2±10.85µs        ? ?/sec
busy_systems/05x_entities_12_systems                     1.02   567.9±26.21µs        ? ?/sec      1.28   713.8±43.14µs        ? ?/sec      1.00   557.8±16.50µs        ? ?/sec
busy_systems/05x_entities_15_systems                     1.01   698.0±43.16µs        ? ?/sec      1.30   905.5±65.56µs        ? ?/sec      1.00   693.9±29.26µs        ? ?/sec
contrived/01x_entities_03_systems                        1.19     25.6±2.88µs        ? ?/sec      1.10     23.8±1.89µs        ? ?/sec      1.00     21.6±1.47µs        ? ?/sec
contrived/01x_entities_06_systems                        1.15     44.9±3.41µs        ? ?/sec      1.32     51.3±3.55µs        ? ?/sec      1.00     38.9±2.50µs        ? ?/sec
contrived/01x_entities_09_systems                        1.00     58.8±3.08µs        ? ?/sec      1.31     76.8±4.15µs        ? ?/sec      1.06     62.4±3.38µs        ? ?/sec
contrived/01x_entities_12_systems                        1.00     77.2±3.30µs        ? ?/sec      1.24     95.7±3.57µs        ? ?/sec      1.05     80.8±3.68µs        ? ?/sec
contrived/01x_entities_15_systems                        1.00     98.1±6.71µs        ? ?/sec      1.27    124.5±8.04µs        ? ?/sec      1.02    100.3±5.92µs        ? ?/sec
contrived/02x_entities_03_systems                        1.06     38.0±3.03µs        ? ?/sec      1.21     43.5±2.05µs        ? ?/sec      1.00     36.0±2.72µs        ? ?/sec
contrived/02x_entities_06_systems                        1.00     66.8±2.94µs        ? ?/sec      1.22     81.2±3.51µs        ? ?/sec      1.02     68.1±7.60µs        ? ?/sec
contrived/02x_entities_09_systems                        1.02    101.0±8.30µs        ? ?/sec      1.24    122.9±4.43µs        ? ?/sec      1.00     99.4±8.88µs        ? ?/sec
contrived/02x_entities_12_systems                        1.00    129.2±6.63µs        ? ?/sec      1.23    159.0±7.20µs        ? ?/sec      1.01    130.5±9.24µs        ? ?/sec
contrived/02x_entities_15_systems                        1.00    157.6±8.04µs        ? ?/sec      1.23   193.2±10.28µs        ? ?/sec      1.05    164.7±9.83µs        ? ?/sec
contrived/03x_entities_03_systems                        1.00     42.7±2.85µs        ? ?/sec      1.36     58.1±5.22µs        ? ?/sec      1.11     47.2±3.06µs        ? ?/sec
contrived/03x_entities_06_systems                        1.07     92.5±7.64µs        ? ?/sec      1.31    113.4±8.22µs        ? ?/sec      1.00     86.6±5.41µs        ? ?/sec
contrived/03x_entities_09_systems                        1.02   136.4±11.06µs        ? ?/sec      1.16    156.1±7.67µs        ? ?/sec      1.00    134.2±5.04µs        ? ?/sec
contrived/03x_entities_12_systems                        1.00    164.6±6.74µs        ? ?/sec      1.29    212.1±9.89µs        ? ?/sec      1.08    178.0±8.28µs        ? ?/sec
contrived/03x_entities_15_systems                        1.00   211.0±10.75µs        ? ?/sec      1.23   258.8±17.68µs        ? ?/sec      1.06   223.2±12.75µs        ? ?/sec
contrived/04x_entities_03_systems                        1.00     52.8±3.18µs        ? ?/sec      1.40     73.7±4.02µs        ? ?/sec      1.15     60.8±6.56µs        ? ?/sec
contrived/04x_entities_06_systems                        1.00    107.8±6.78µs        ? ?/sec      1.25    135.0±5.74µs        ? ?/sec      1.12    121.0±6.35µs        ? ?/sec
contrived/04x_entities_09_systems                        1.00   158.7±12.11µs        ? ?/sec      1.25    197.8±5.62µs        ? ?/sec      1.14   180.4±13.79µs        ? ?/sec
contrived/04x_entities_12_systems                        1.00   228.4±10.87µs        ? ?/sec      1.05   240.3±10.04µs        ? ?/sec      1.01    230.5±8.08µs        ? ?/sec
contrived/04x_entities_15_systems                        1.00   269.0±15.47µs        ? ?/sec      1.08    291.2±8.13µs        ? ?/sec      1.03    276.2±9.80µs        ? ?/sec
contrived/05x_entities_03_systems                        1.00     68.1±6.48µs        ? ?/sec      1.17     79.5±2.46µs        ? ?/sec      1.02     69.6±6.22µs        ? ?/sec
contrived/05x_entities_06_systems                        1.04   145.7±12.90µs        ? ?/sec      1.12    156.9±4.30µs        ? ?/sec      1.00    139.7±8.23µs        ? ?/sec
contrived/05x_entities_09_systems                        1.00   186.1±11.30µs        ? ?/sec      1.26    234.7±6.38µs        ? ?/sec      1.14    213.1±7.23µs        ? ?/sec
contrived/05x_entities_12_systems                        1.00   267.6±14.86µs        ? ?/sec      1.13   302.8±14.85µs        ? ?/sec      1.02   272.1±13.59µs        ? ?/sec
contrived/05x_entities_15_systems                        1.00   317.6±20.28µs        ? ?/sec      1.20   379.8±27.06µs        ? ?/sec      1.02   323.9±10.80µs        ? ?/sec
empty_commands/0_entities                                1.05      5.5±0.11ns        ? ?/sec      1.06      5.5±0.19ns        ? ?/sec      1.00      5.2±0.14ns        ? ?/sec
empty_systems/000_systems                                47.71 1041.1±123.55ns        ? ?/sec     1.12     24.4±0.18ns        ? ?/sec      1.00     21.8±0.29ns        ? ?/sec
empty_systems/001_systems                                2.33      5.1±0.32µs        ? ?/sec      1.00      2.2±0.13µs        ? ?/sec      1.70      3.7±0.22µs        ? ?/sec
empty_systems/002_systems                                2.17      6.4±0.23µs        ? ?/sec      1.00      2.9±0.12µs        ? ?/sec      1.74      5.1±0.40µs        ? ?/sec
empty_systems/003_systems                                2.02      7.2±0.33µs        ? ?/sec      1.00      3.6±0.23µs        ? ?/sec      1.63      5.8±0.32µs        ? ?/sec
empty_systems/004_systems                                1.73      7.9±0.50µs        ? ?/sec      1.00      4.6±0.15µs        ? ?/sec      1.53      7.0±0.61µs        ? ?/sec
empty_systems/005_systems                                1.70      9.3±0.60µs        ? ?/sec      1.00      5.5±0.49µs        ? ?/sec      1.57      8.6±0.85µs        ? ?/sec
empty_systems/010_systems                                1.92     14.7±0.50µs        ? ?/sec      1.00      7.7±0.52µs        ? ?/sec      1.67     12.9±1.57µs        ? ?/sec
empty_systems/015_systems                                1.91     18.1±1.63µs        ? ?/sec      1.00      9.5±0.66µs        ? ?/sec      1.87     17.8±1.39µs        ? ?/sec
empty_systems/020_systems                                2.07     22.7±1.93µs        ? ?/sec      1.00     10.9±0.29µs        ? ?/sec      1.85     20.2±1.65µs        ? ?/sec
empty_systems/025_systems                                2.06     27.1±1.65µs        ? ?/sec      1.00     13.1±0.49µs        ? ?/sec      1.85     24.3±1.61µs        ? ?/sec
empty_systems/030_systems                                2.04     30.8±2.23µs        ? ?/sec      1.00     15.1±0.46µs        ? ?/sec      1.88     28.4±1.91µs        ? ?/sec
empty_systems/035_systems                                1.96     34.6±1.86µs        ? ?/sec      1.00     17.7±0.79µs        ? ?/sec      1.80     31.8±2.01µs        ? ?/sec
empty_systems/040_systems                                1.95     37.8±2.37µs        ? ?/sec      1.00     19.3±0.47µs        ? ?/sec      1.83     35.4±1.16µs        ? ?/sec
empty_systems/045_systems                                1.97     42.3±2.59µs        ? ?/sec      1.00     21.5±0.43µs        ? ?/sec      1.84     39.5±2.02µs        ? ?/sec
empty_systems/050_systems                                1.85     45.1±3.14µs        ? ?/sec      1.00     24.4±0.66µs        ? ?/sec      1.74     42.3±1.77µs        ? ?/sec
empty_systems/055_systems                                1.80     48.2±3.78µs        ? ?/sec      1.00     26.7±0.88µs        ? ?/sec      1.76     47.0±1.77µs        ? ?/sec
empty_systems/060_systems                                1.73     50.6±5.32µs        ? ?/sec      1.00     29.3±0.99µs        ? ?/sec      1.69     49.6±1.69µs        ? ?/sec
empty_systems/065_systems                                1.59     50.6±5.10µs        ? ?/sec      1.00     31.8±0.88µs        ? ?/sec      1.71     54.3±2.17µs        ? ?/sec
empty_systems/070_systems                                1.60     54.5±5.13µs        ? ?/sec      1.00     34.0±1.22µs        ? ?/sec      1.72     58.6±2.45µs        ? ?/sec
empty_systems/075_systems                                1.57     57.8±4.84µs        ? ?/sec      1.00     36.8±1.36µs        ? ?/sec      1.71     63.0±2.49µs        ? ?/sec
empty_systems/080_systems                                1.65     60.2±4.76µs        ? ?/sec      1.00     36.6±1.51µs        ? ?/sec      1.87     68.6±2.85µs        ? ?/sec
empty_systems/085_systems                                1.59     63.7±5.42µs        ? ?/sec      1.00     40.1±1.28µs        ? ?/sec      1.84     73.9±2.54µs        ? ?/sec
empty_systems/090_systems                                1.63     65.7±5.60µs        ? ?/sec      1.00     40.4±2.25µs        ? ?/sec      2.00     80.6±4.74µs        ? ?/sec
empty_systems/095_systems                                1.66     71.2±5.05µs        ? ?/sec      1.00     42.8±1.91µs        ? ?/sec      2.04     87.2±4.11µs        ? ?/sec
empty_systems/100_systems                                1.59     72.9±6.40µs        ? ?/sec      1.00     45.8±2.64µs        ? ?/sec      1.95     89.3±3.56µs        ? ?/sec
for_each_iter                                            1.00     27.2±0.21ms        ? ?/sec      1.01     27.4±0.29ms        ? ?/sec      1.00     27.2±0.23ms        ? ?/sec
for_each_par_iter/threads/1                              1.00     17.4±0.75ms        ? ?/sec      1.00     17.5±0.72ms        ? ?/sec      1.01     17.6±1.34ms        ? ?/sec
for_each_par_iter/threads/16                             1.63      3.7±0.08ms        ? ?/sec      1.62      3.6±0.08ms        ? ?/sec      1.00      2.2±0.09ms        ? ?/sec
for_each_par_iter/threads/2                              1.67     17.5±0.75ms        ? ?/sec      1.68     17.5±0.90ms        ? ?/sec      1.00     10.4±0.28ms        ? ?/sec
for_each_par_iter/threads/32                             1.00      2.1±0.13ms        ? ?/sec      1.02      2.2±0.05ms        ? ?/sec      1.00      2.1±0.09ms        ? ?/sec
for_each_par_iter/threads/4                              1.61     10.6±0.33ms        ? ?/sec      1.63     10.7±0.28ms        ? ?/sec      1.00      6.6±0.64ms        ? ?/sec
for_each_par_iter/threads/8                              1.75      6.5±0.10ms        ? ?/sec      1.76      6.5±0.09ms        ? ?/sec      1.00      3.7±0.28ms        ? ?/sec
many_maps_iter                                           1.00     27.2±0.05ms        ? ?/sec      1.01     27.4±0.14ms        ? ?/sec      1.00     27.2±0.27ms        ? ?/sec
many_maps_par_iter/threads/1                             1.00     17.5±0.85ms        ? ?/sec      1.01     17.5±0.72ms        ? ?/sec      1.00     17.4±0.79ms        ? ?/sec
many_maps_par_iter/threads/16                            1.66      3.6±0.03ms        ? ?/sec      1.65      3.6±0.03ms        ? ?/sec      1.00      2.2±0.07ms        ? ?/sec
many_maps_par_iter/threads/2                             1.68     17.4±0.79ms        ? ?/sec      1.68     17.4±0.79ms        ? ?/sec      1.00     10.4±0.20ms        ? ?/sec
many_maps_par_iter/threads/32                            1.03      2.1±0.03ms        ? ?/sec      1.02      2.1±0.04ms        ? ?/sec      1.00      2.1±0.08ms        ? ?/sec
many_maps_par_iter/threads/4                             1.66     10.6±0.20ms        ? ?/sec      1.67     10.7±0.23ms        ? ?/sec      1.00      6.4±0.08ms        ? ?/sec
many_maps_par_iter/threads/8                             1.81      6.5±0.08ms        ? ?/sec      1.80      6.5±0.07ms        ? ?/sec      1.00      3.6±0.02ms        ? ?/sec
no_archetypes/system_count/0                             90.82 1985.3±98.01ns        ? ?/sec      1.11     24.3±0.23ns        ? ?/sec      1.00     21.9±0.93ns        ? ?/sec
no_archetypes/system_count/100                           2.07     92.3±3.02µs        ? ?/sec      1.00     44.7±2.02µs        ? ?/sec      2.47    110.3±6.33µs        ? ?/sec
no_archetypes/system_count/20                            1.77     20.3±0.90µs        ? ?/sec      1.00     11.5±0.60µs        ? ?/sec      1.95     22.4±0.95µs        ? ?/sec
no_archetypes/system_count/40                            1.78     37.3±0.89µs        ? ?/sec      1.00     20.9±1.18µs        ? ?/sec      2.03     42.4±1.00µs        ? ?/sec
no_archetypes/system_count/60                            1.93     55.6±1.17µs        ? ?/sec      1.00     28.9±1.95µs        ? ?/sec      2.18     62.9±1.96µs        ? ?/sec
no_archetypes/system_count/80                            1.92     73.0±1.41µs        ? ?/sec      1.00     38.0±1.91µs        ? ?/sec      2.22     84.3±2.55µs        ? ?/sec
overhead_par_iter/threads/1                              1.23     28.0±1.94µs        ? ?/sec      1.00     22.7±1.34µs        ? ?/sec      1.80     40.8±5.60µs        ? ?/sec
overhead_par_iter/threads/16                             1.04     28.5±0.76µs        ? ?/sec      1.00     27.3±1.38µs        ? ?/sec      2.40     65.6±2.09µs        ? ?/sec
overhead_par_iter/threads/2                              1.24     27.2±1.34µs        ? ?/sec      1.00     22.0±0.90µs        ? ?/sec      2.72     60.0±6.45µs        ? ?/sec
overhead_par_iter/threads/32                             1.00     25.0±0.87µs        ? ?/sec      1.13     28.4±1.07µs        ? ?/sec      2.71     68.0±2.48µs        ? ?/sec
overhead_par_iter/threads/4                              1.15     33.6±1.28µs        ? ?/sec      1.00     29.2±1.61µs        ? ?/sec      2.23     65.1±7.52µs        ? ?/sec
overhead_par_iter/threads/8                              1.00     23.5±0.97µs        ? ?/sec      1.04     24.4±1.56µs        ? ?/sec      2.48     58.2±1.66µs        ? ?/sec
run_criteria/no/001_systems                              1.12      2.9±0.56µs        ? ?/sec      1.00      2.6±0.61µs        ? ?/sec      1.10      2.9±0.20µs        ? ?/sec
run_criteria/no/006_systems                              1.27      2.5±0.31µs        ? ?/sec      1.00  1954.6±492.52ns        ? ?/sec     1.75      3.4±0.35µs        ? ?/sec
run_criteria/no/011_systems                              1.56      2.5±0.26µs        ? ?/sec      1.00  1589.7±158.57ns        ? ?/sec     2.91      4.6±1.19µs        ? ?/sec
run_criteria/no/016_systems                              2.15      3.3±0.80µs        ? ?/sec      1.00  1535.3±97.05ns        ? ?/sec      3.50      5.4±1.91µs        ? ?/sec
run_criteria/no/021_systems                              2.14      3.9±1.66µs        ? ?/sec      1.00  1844.2±212.39ns        ? ?/sec     3.33      6.1±3.50µs        ? ?/sec
run_criteria/no/026_systems                              3.42      6.3±4.12µs        ? ?/sec      1.00  1850.4±299.14ns        ? ?/sec     4.43      8.2±3.62µs        ? ?/sec
run_criteria/no/031_systems                              2.86      6.3±3.55µs        ? ?/sec      1.00      2.2±0.35µs        ? ?/sec      4.95     10.9±5.03µs        ? ?/sec
run_criteria/no/036_systems                              2.33      7.6±4.35µs        ? ?/sec      1.00      3.3±1.14µs        ? ?/sec      3.83     12.5±5.06µs        ? ?/sec
run_criteria/no/041_systems                              1.46      5.0±2.93µs        ? ?/sec      1.00      3.4±1.11µs        ? ?/sec      3.44     11.9±5.38µs        ? ?/sec
run_criteria/no/046_systems                              1.33      4.9±2.65µs        ? ?/sec      1.00      3.7±1.30µs        ? ?/sec      3.41     12.6±5.27µs        ? ?/sec
run_criteria/no/051_systems                              1.24      6.6±3.57µs        ? ?/sec      1.00      5.3±2.46µs        ? ?/sec      2.06     10.9±5.20µs        ? ?/sec
run_criteria/no/056_systems                              1.87     10.8±4.79µs        ? ?/sec      1.00      5.8±2.16µs        ? ?/sec      1.76     10.2±5.44µs        ? ?/sec
run_criteria/no/061_systems                              1.21      8.2±4.35µs        ? ?/sec      1.00      6.7±3.22µs        ? ?/sec      1.83     12.3±5.16µs        ? ?/sec
run_criteria/no/066_systems                              1.83     12.0±4.99µs        ? ?/sec      1.00      6.6±2.75µs        ? ?/sec      2.79     18.2±4.25µs        ? ?/sec
run_criteria/no/071_systems                              2.21     15.4±5.88µs        ? ?/sec      1.00      7.0±3.20µs        ? ?/sec      2.45     17.2±4.69µs        ? ?/sec
run_criteria/no/076_systems                              2.07     17.8±4.30µs        ? ?/sec      1.00      8.6±3.39µs        ? ?/sec      2.18     18.7±3.31µs        ? ?/sec
run_criteria/no/081_systems                              1.72     17.4±4.03µs        ? ?/sec      1.00     10.1±4.03µs        ? ?/sec      1.72     17.4±4.45µs        ? ?/sec
run_criteria/no/086_systems                              1.33     17.0±4.42µs        ? ?/sec      1.00     12.8±3.28µs        ? ?/sec      1.49     19.0±4.34µs        ? ?/sec
run_criteria/no/091_systems                              1.20     18.8±2.59µs        ? ?/sec      1.00     15.7±1.71µs        ? ?/sec      1.25     19.6±4.11µs        ? ?/sec
run_criteria/no/096_systems                              1.23     19.4±2.10µs        ? ?/sec      1.00     15.7±1.88µs        ? ?/sec      1.35     21.1±2.74µs        ? ?/sec
run_criteria/no/101_systems                              1.14     19.3±3.27µs        ? ?/sec      1.00     17.0±1.75µs        ? ?/sec      1.22     20.7±3.74µs        ? ?/sec
run_criteria/no_with_labels/001_systems                  1.42      2.1±0.21µs        ? ?/sec      1.00  1500.9±286.27ns        ? ?/sec     1.81      2.7±0.10µs        ? ?/sec
run_criteria/no_with_labels/006_systems                  1.97      2.7±0.22µs        ? ?/sec      1.00  1380.4±186.00ns        ? ?/sec     2.19      3.0±0.38µs        ? ?/sec
run_criteria/no_with_labels/011_systems                  2.06      3.0±0.50µs        ? ?/sec      1.00  1464.4±129.83ns        ? ?/sec     1.88      2.8±0.56µs        ? ?/sec
run_criteria/no_with_labels/016_systems                  2.23      3.4±1.01µs        ? ?/sec      1.00  1510.7±102.20ns        ? ?/sec     1.99      3.0±0.53µs        ? ?/sec
run_criteria/no_with_labels/021_systems                  2.30      3.7±1.25µs        ? ?/sec      1.00  1613.6±266.62ns        ? ?/sec     1.84      3.0±0.59µs        ? ?/sec
run_criteria/no_with_labels/026_systems                  3.03      4.8±2.15µs        ? ?/sec      1.00  1570.4±105.43ns        ? ?/sec     2.35      3.7±0.70µs        ? ?/sec
run_criteria/no_with_labels/031_systems                  2.05      4.2±1.85µs        ? ?/sec      1.00      2.1±0.30µs        ? ?/sec      2.91      6.0±2.32µs        ? ?/sec
run_criteria/no_with_labels/036_systems                  1.98      4.0±1.64µs        ? ?/sec      1.00      2.0±0.34µs        ? ?/sec      3.62      7.4±4.28µs        ? ?/sec
run_criteria/no_with_labels/041_systems                  3.31      7.3±3.33µs        ? ?/sec      1.00      2.2±1.19µs        ? ?/sec      5.04     11.1±3.83µs        ? ?/sec
run_criteria/no_with_labels/046_systems                  3.71      8.1±3.60µs        ? ?/sec      1.00      2.2±0.27µs        ? ?/sec      3.06      6.7±3.43µs        ? ?/sec
run_criteria/no_with_labels/051_systems                  3.15      7.6±3.46µs        ? ?/sec      1.00      2.4±0.50µs        ? ?/sec      2.45      5.9±3.59µs        ? ?/sec
run_criteria/no_with_labels/056_systems                  2.54      7.7±3.96µs        ? ?/sec      1.00      3.0±1.66µs        ? ?/sec      1.69      5.1±2.97µs        ? ?/sec
run_criteria/no_with_labels/061_systems                  2.18      8.5±4.26µs        ? ?/sec      1.00      3.9±2.01µs        ? ?/sec      1.40      5.5±3.39µs        ? ?/sec
run_criteria/no_with_labels/066_systems                  2.55     10.7±4.67µs        ? ?/sec      1.00      4.2±2.10µs        ? ?/sec      1.49      6.3±3.17µs        ? ?/sec
run_criteria/no_with_labels/071_systems                  2.70     11.9±5.51µs        ? ?/sec      1.00      4.4±1.52µs        ? ?/sec      1.44      6.4±4.49µs        ? ?/sec
run_criteria/no_with_labels/076_systems                  3.07     14.9±5.07µs        ? ?/sec      1.00      4.9±1.79µs        ? ?/sec      1.37      6.6±2.98µs        ? ?/sec
run_criteria/no_with_labels/081_systems                  2.25     12.9±4.99µs        ? ?/sec      1.00      5.7±2.43µs        ? ?/sec      1.23      7.1±3.08µs        ? ?/sec
run_criteria/no_with_labels/086_systems                  2.31     15.5±5.16µs        ? ?/sec      1.01      6.8±3.01µs        ? ?/sec      1.00      6.7±4.14µs        ? ?/sec
run_criteria/no_with_labels/091_systems                  2.44     17.8±4.04µs        ? ?/sec      1.00      7.3±3.01µs        ? ?/sec      1.17      8.5±3.81µs        ? ?/sec
run_criteria/no_with_labels/096_systems                  3.03     22.7±0.90µs        ? ?/sec      1.00      7.5±3.16µs        ? ?/sec      1.47     11.0±4.84µs        ? ?/sec
run_criteria/no_with_labels/101_systems                  1.69     19.0±3.62µs        ? ?/sec      1.01     11.4±3.80µs        ? ?/sec      1.00     11.2±5.86µs        ? ?/sec
run_criteria/yes/001_systems                             1.20      3.7±0.21µs        ? ?/sec      1.05      3.2±0.17µs        ? ?/sec      1.00      3.1±0.11µs        ? ?/sec
run_criteria/yes/006_systems                             1.25      8.5±0.27µs        ? ?/sec      1.00      6.8±0.25µs        ? ?/sec      1.22      8.3±0.54µs        ? ?/sec
run_criteria/yes/011_systems                             1.21     11.9±0.61µs        ? ?/sec      1.00      9.8±0.34µs        ? ?/sec      1.39     13.7±0.64µs        ? ?/sec
run_criteria/yes/016_systems                             1.24     15.8±0.53µs        ? ?/sec      1.00     12.8±0.60µs        ? ?/sec      1.46     18.7±1.06µs        ? ?/sec
run_criteria/yes/021_systems                             1.30     19.9±0.85µs        ? ?/sec      1.00     15.3±0.44µs        ? ?/sec      1.53     23.5±1.27µs        ? ?/sec
run_criteria/yes/026_systems                             1.38     24.7±0.97µs        ? ?/sec      1.00     17.9±0.75µs        ? ?/sec      1.61     28.8±1.13µs        ? ?/sec
run_criteria/yes/031_systems                             1.35     27.5±1.86µs        ? ?/sec      1.00     20.4±0.46µs        ? ?/sec      1.65     33.6±2.27µs        ? ?/sec
run_criteria/yes/036_systems                             1.48     31.9±1.18µs        ? ?/sec      1.00     21.6±0.80µs        ? ?/sec      1.78     38.5±1.42µs        ? ?/sec
run_criteria/yes/041_systems                             1.46     36.2±1.34µs        ? ?/sec      1.00     24.9±0.79µs        ? ?/sec      1.73     43.1±2.01µs        ? ?/sec
run_criteria/yes/046_systems                             1.45     40.2±1.11µs        ? ?/sec      1.00     27.8±1.53µs        ? ?/sec      1.76     49.0±2.32µs        ? ?/sec
run_criteria/yes/051_systems                             1.44     44.6±1.20µs        ? ?/sec      1.00     30.9±1.98µs        ? ?/sec      1.75     54.2±1.67µs        ? ?/sec
run_criteria/yes/056_systems                             1.46     47.7±1.29µs        ? ?/sec      1.00     32.6±1.32µs        ? ?/sec      1.80     58.7±1.95µs        ? ?/sec
run_criteria/yes/061_systems                             1.50     51.9±1.38µs        ? ?/sec      1.00     34.7±0.93µs        ? ?/sec      1.84     63.7±2.14µs        ? ?/sec
run_criteria/yes/066_systems                             1.52     55.7±1.44µs        ? ?/sec      1.00     36.6±1.16µs        ? ?/sec      1.86     68.2±2.85µs        ? ?/sec
run_criteria/yes/071_systems                             1.62     60.4±1.96µs        ? ?/sec      1.00     37.4±1.39µs        ? ?/sec      1.96     73.1±3.83µs        ? ?/sec
run_criteria/yes/076_systems                             1.62     63.5±2.26µs        ? ?/sec      1.00     39.1±0.89µs        ? ?/sec      2.00     78.3±3.38µs        ? ?/sec
run_criteria/yes/081_systems                             1.61     67.1±1.92µs        ? ?/sec      1.00     41.7±1.42µs        ? ?/sec      1.92     80.2±4.09µs        ? ?/sec
run_criteria/yes/086_systems                             1.64     70.8±2.83µs        ? ?/sec      1.00     43.3±1.04µs        ? ?/sec      2.05     88.9±3.53µs        ? ?/sec
run_criteria/yes/091_systems                             1.60     76.0±2.81µs        ? ?/sec      1.00     47.5±1.06µs        ? ?/sec      1.95     92.7±4.81µs        ? ?/sec
run_criteria/yes/096_systems                             1.60     81.1±2.89µs        ? ?/sec      1.00     50.6±1.52µs        ? ?/sec      1.99    100.7±4.10µs        ? ?/sec
run_criteria/yes/101_systems                             1.62     84.5±3.39µs        ? ?/sec      1.00     52.2±2.11µs        ? ?/sec      2.14    111.7±4.51µs        ? ?/sec
run_criteria/yes_using_query/001_systems                 1.26      3.8±0.13µs        ? ?/sec      1.16      3.5±0.14µs        ? ?/sec      1.00      3.0±0.18µs        ? ?/sec
run_criteria/yes_using_query/006_systems                 1.27      8.6±0.37µs        ? ?/sec      1.00      6.8±0.16µs        ? ?/sec      1.28      8.7±0.47µs        ? ?/sec
run_criteria/yes_using_query/011_systems                 1.31     12.6±0.63µs        ? ?/sec      1.00      9.6±0.24µs        ? ?/sec      1.42     13.7±0.75µs        ? ?/sec
run_criteria/yes_using_query/016_systems                 1.30     16.3±0.71µs        ? ?/sec      1.00     12.5±0.53µs        ? ?/sec      1.51     18.9±1.05µs        ? ?/sec
run_criteria/yes_using_query/021_systems                 1.31     20.3±1.07µs        ? ?/sec      1.00     15.4±0.47µs        ? ?/sec      1.59     24.5±1.25µs        ? ?/sec
run_criteria/yes_using_query/026_systems                 1.39     24.2±0.98µs        ? ?/sec      1.00     17.4±0.43µs        ? ?/sec      1.69     29.4±1.25µs        ? ?/sec
run_criteria/yes_using_query/031_systems                 1.47     28.7±1.26µs        ? ?/sec      1.00     19.5±0.29µs        ? ?/sec      1.70     33.3±1.66µs        ? ?/sec
run_criteria/yes_using_query/036_systems                 1.52     32.5±1.31µs        ? ?/sec      1.00     21.4±0.48µs        ? ?/sec      1.76     37.7±1.78µs        ? ?/sec
run_criteria/yes_using_query/041_systems                 1.45     36.2±1.66µs        ? ?/sec      1.00     25.0±0.47µs        ? ?/sec      1.72     43.1±1.79µs        ? ?/sec
run_criteria/yes_using_query/046_systems                 1.47     39.7±1.25µs        ? ?/sec      1.00     27.0±0.42µs        ? ?/sec      1.74     47.0±2.49µs        ? ?/sec
run_criteria/yes_using_query/051_systems                 1.47     43.4±1.48µs        ? ?/sec      1.00     29.5±0.78µs        ? ?/sec      1.73     51.0±2.96µs        ? ?/sec
run_criteria/yes_using_query/056_systems                 1.54     48.5±1.58µs        ? ?/sec      1.00     31.5±1.05µs        ? ?/sec      1.83     57.8±2.88µs        ? ?/sec
run_criteria/yes_using_query/061_systems                 1.44     51.8±2.32µs        ? ?/sec      1.00     36.0±0.54µs        ? ?/sec      1.71     61.4±3.31µs        ? ?/sec
run_criteria/yes_using_query/066_systems                 1.62     55.6±2.17µs        ? ?/sec      1.00     34.3±0.59µs        ? ?/sec      1.91     65.5±3.31µs        ? ?/sec
run_criteria/yes_using_query/071_systems                 1.59     58.9±2.33µs        ? ?/sec      1.00     37.1±0.94µs        ? ?/sec      1.92     71.0±3.59µs        ? ?/sec
run_criteria/yes_using_query/076_systems                 1.58     62.9±3.02µs        ? ?/sec      1.00     39.7±1.46µs        ? ?/sec      1.95     77.4±3.64µs        ? ?/sec
run_criteria/yes_using_query/081_systems                 1.62     65.7±3.12µs        ? ?/sec      1.00     40.6±0.95µs        ? ?/sec      2.01     81.6±4.46µs        ? ?/sec
run_criteria/yes_using_query/086_systems                 1.59     71.4±4.13µs        ? ?/sec      1.00     45.0±1.81µs        ? ?/sec      1.92     86.5±6.29µs        ? ?/sec
run_criteria/yes_using_query/091_systems                 1.64     74.4±3.26µs        ? ?/sec      1.00     45.4±1.68µs        ? ?/sec      2.15     97.4±6.50µs        ? ?/sec
run_criteria/yes_using_query/096_systems                 1.67     82.3±4.09µs        ? ?/sec      1.00     49.2±1.61µs        ? ?/sec      2.08    102.4±7.02µs        ? ?/sec
run_criteria/yes_using_query/101_systems                 1.69     84.2±3.37µs        ? ?/sec      1.00     49.8±1.39µs        ? ?/sec      2.24    111.6±5.54µs        ? ?/sec
run_criteria/yes_using_resource/001_systems              1.22      3.7±0.20µs        ? ?/sec      1.00      3.0±0.11µs        ? ?/sec      1.07      3.2±0.29µs        ? ?/sec
run_criteria/yes_using_resource/006_systems              1.28      8.7±0.20µs        ? ?/sec      1.00      6.8±0.13µs        ? ?/sec      1.25      8.4±0.36µs        ? ?/sec
run_criteria/yes_using_resource/011_systems              1.31     12.9±0.46µs        ? ?/sec      1.00      9.8±0.37µs        ? ?/sec      1.37     13.4±0.82µs        ? ?/sec
run_criteria/yes_using_resource/016_systems              1.32     16.8±0.58µs        ? ?/sec      1.00     12.7±0.29µs        ? ?/sec      1.49     18.9±0.91µs        ? ?/sec
run_criteria/yes_using_resource/021_systems              1.36     20.9±0.75µs        ? ?/sec      1.00     15.4±0.26µs        ? ?/sec      1.58     24.2±1.42µs        ? ?/sec
run_criteria/yes_using_resource/026_systems              1.45     25.1±0.93µs        ? ?/sec      1.00     17.3±0.37µs        ? ?/sec      1.70     29.4±1.38µs        ? ?/sec
run_criteria/yes_using_resource/031_systems              1.48     29.1±0.84µs        ? ?/sec      1.00     19.6±0.19µs        ? ?/sec      1.75     34.3±1.53µs        ? ?/sec
run_criteria/yes_using_resource/036_systems              1.58     33.3±1.34µs        ? ?/sec      1.00     21.1±0.32µs        ? ?/sec      1.89     39.8±1.63µs        ? ?/sec
run_criteria/yes_using_resource/041_systems              1.44     36.4±1.34µs        ? ?/sec      1.00     25.2±0.43µs        ? ?/sec      1.71     43.2±1.86µs        ? ?/sec
run_criteria/yes_using_resource/046_systems              1.51     40.5±1.31µs        ? ?/sec      1.00     26.7±0.49µs        ? ?/sec      1.80     48.1±1.99µs        ? ?/sec
run_criteria/yes_using_resource/051_systems              1.55     44.2±1.20µs        ? ?/sec      1.00     28.5±0.49µs        ? ?/sec      1.85     52.7±2.18µs        ? ?/sec
run_criteria/yes_using_resource/056_systems              1.54     47.1±2.40µs        ? ?/sec      1.00     30.5±0.42µs        ? ?/sec      2.03     61.9±2.41µs        ? ?/sec
run_criteria/yes_using_resource/061_systems              1.59     51.4±1.97µs        ? ?/sec      1.00     32.4±0.35µs        ? ?/sec      1.90     61.7±4.63µs        ? ?/sec
run_criteria/yes_using_resource/066_systems              1.65     55.2±2.12µs        ? ?/sec      1.00     33.5±0.29µs        ? ?/sec      2.01     67.3±3.26µs        ? ?/sec
run_criteria/yes_using_resource/071_systems              1.62     58.8±2.72µs        ? ?/sec      1.00     36.2±0.46µs        ? ?/sec      2.06     74.6±2.89µs        ? ?/sec
run_criteria/yes_using_resource/076_systems              1.67     64.0±3.40µs        ? ?/sec      1.00     38.4±0.55µs        ? ?/sec      2.12     81.3±3.47µs        ? ?/sec
run_criteria/yes_using_resource/081_systems              1.73     68.1±2.01µs        ? ?/sec      1.00     39.3±0.51µs        ? ?/sec      2.16     84.9±4.12µs        ? ?/sec
run_criteria/yes_using_resource/086_systems              1.70     72.0±2.20µs        ? ?/sec      1.00     42.2±0.64µs        ? ?/sec      2.12     89.7±4.26µs        ? ?/sec
run_criteria/yes_using_resource/091_systems              1.81     76.3±3.38µs        ? ?/sec      1.00     42.1±0.93µs        ? ?/sec      2.33     98.3±4.93µs        ? ?/sec
run_criteria/yes_using_resource/096_systems              1.73     80.5±2.98µs        ? ?/sec      1.00     46.7±0.82µs        ? ?/sec      2.20    102.5±7.06µs        ? ?/sec
run_criteria/yes_using_resource/101_systems              1.64     85.6±3.18µs        ? ?/sec      1.00     52.2±1.05µs        ? ?/sec      2.20    114.9±6.95µs        ? ?/sec
run_criteria/yes_with_labels/001_systems                 1.28      3.7±0.19µs        ? ?/sec      1.00      2.9±0.16µs        ? ?/sec      1.11      3.2±0.15µs        ? ?/sec
run_criteria/yes_with_labels/006_systems                 1.27      8.9±0.20µs        ? ?/sec      1.00      7.0±0.47µs        ? ?/sec      1.18      8.2±0.19µs        ? ?/sec
run_criteria/yes_with_labels/011_systems                 1.41     13.2±0.43µs        ? ?/sec      1.00      9.4±0.28µs        ? ?/sec      1.43     13.4±0.68µs        ? ?/sec
run_criteria/yes_with_labels/016_systems                 1.30     16.6±2.19µs        ? ?/sec      1.00     12.7±0.43µs        ? ?/sec      1.50     19.1±0.89µs        ? ?/sec
run_criteria/yes_with_labels/021_systems                 1.39     21.4±0.89µs        ? ?/sec      1.00     15.4±0.37µs        ? ?/sec      1.62     24.9±1.02µs        ? ?/sec
run_criteria/yes_with_labels/026_systems                 1.50     25.6±1.05µs        ? ?/sec      1.00     17.0±0.47µs        ? ?/sec      1.75     29.9±1.05µs        ? ?/sec
run_criteria/yes_with_labels/031_systems                 1.48     28.8±1.61µs        ? ?/sec      1.00     19.4±0.42µs        ? ?/sec      1.79     34.9±1.87µs        ? ?/sec
run_criteria/yes_with_labels/036_systems                 1.50     32.5±1.25µs        ? ?/sec      1.00     21.6±0.41µs        ? ?/sec      1.85     40.0±1.44µs        ? ?/sec
run_criteria/yes_with_labels/041_systems                 1.52     36.3±1.49µs        ? ?/sec      1.00     23.9±0.43µs        ? ?/sec      1.85     44.1±1.55µs        ? ?/sec
run_criteria/yes_with_labels/046_systems                 1.48     39.4±1.46µs        ? ?/sec      1.00     26.7±0.50µs        ? ?/sec      1.84     49.2±1.72µs        ? ?/sec
run_criteria/yes_with_labels/051_systems                 1.62     44.8±1.33µs        ? ?/sec      1.00     27.6±0.54µs        ? ?/sec      1.93     53.4±1.82µs        ? ?/sec
run_criteria/yes_with_labels/056_systems                 1.63     47.2±1.82µs        ? ?/sec      1.00     28.9±0.60µs        ? ?/sec      2.06     59.6±2.01µs        ? ?/sec
run_criteria/yes_with_labels/061_systems                 1.67     51.5±2.06µs        ? ?/sec      1.00     30.8±1.18µs        ? ?/sec      2.07     63.9±2.56µs        ? ?/sec
run_criteria/yes_with_labels/066_systems                 1.69     56.2±2.04µs        ? ?/sec      1.00     33.3±0.63µs        ? ?/sec      2.11     70.3±2.60µs        ? ?/sec
run_criteria/yes_with_labels/071_systems                 1.69     59.3±1.52µs        ? ?/sec      1.00     35.1±0.60µs        ? ?/sec      2.10     73.6±2.70µs        ? ?/sec
run_criteria/yes_with_labels/076_systems                 1.72     63.0±1.99µs        ? ?/sec      1.00     36.6±1.24µs        ? ?/sec      2.16     79.2±3.82µs        ? ?/sec
run_criteria/yes_with_labels/081_systems                 1.67     66.1±2.04µs        ? ?/sec      1.00     39.7±0.81µs        ? ?/sec      2.18     86.3±3.92µs        ? ?/sec
run_criteria/yes_with_labels/086_systems                 1.70     70.2±1.81µs        ? ?/sec      1.00     41.3±0.63µs        ? ?/sec      2.22     91.6±4.59µs        ? ?/sec
run_criteria/yes_with_labels/091_systems                 1.72     74.9±2.17µs        ? ?/sec      1.00     43.5±0.52µs        ? ?/sec      2.28     99.0±4.03µs        ? ?/sec
run_criteria/yes_with_labels/096_systems                 1.80     82.3±2.73µs        ? ?/sec      1.00     45.7±0.65µs        ? ?/sec      2.25    102.9±3.44µs        ? ?/sec
run_criteria/yes_with_labels/101_systems                 1.68     83.7±2.77µs        ? ?/sec      1.00     49.8±1.69µs        ? ?/sec      2.25    112.3±4.85µs        ? ?/sec
schedule/base                                            1.26     36.4±2.35µs        ? ?/sec      1.21     35.1±2.57µs        ? ?/sec      1.00     29.0±2.55µs        ? ?/sec
Main vs Combined
group                                                    main                                     start-and-internalization
-----                                                    ----                                     -------------------------
added_archetypes/archetype_count/100                     12.00 1294.4±47.68µs        ? ?/sec      1.00    107.9±5.44µs        ? ?/sec
added_archetypes/archetype_count/1000                    2.87  1957.3±133.68µs        ? ?/sec     1.00   681.9±33.90µs        ? ?/sec
added_archetypes/archetype_count/10000                   1.23     17.1±1.46ms        ? ?/sec      1.00     14.0±1.12ms        ? ?/sec
added_archetypes/archetype_count/200                     8.18  1335.0±33.66µs        ? ?/sec      1.00    163.2±4.59µs        ? ?/sec
added_archetypes/archetype_count/2000                    2.91      4.1±0.21ms        ? ?/sec      1.00  1410.3±69.25µs        ? ?/sec
added_archetypes/archetype_count/500                     4.48  1585.0±71.94µs        ? ?/sec      1.00    353.9±8.52µs        ? ?/sec
added_archetypes/archetype_count/5000                    1.68      8.6±0.98ms        ? ?/sec      1.00      5.1±0.61ms        ? ?/sec
busy_systems/01x_entities_03_systems                     1.35     40.4±2.52µs        ? ?/sec      1.00     29.8±0.97µs        ? ?/sec
busy_systems/01x_entities_06_systems                     1.01     79.0±3.66µs        ? ?/sec      1.00     78.5±1.61µs        ? ?/sec
busy_systems/01x_entities_09_systems                     1.07    125.5±6.04µs        ? ?/sec      1.00    117.2±2.80µs        ? ?/sec
busy_systems/01x_entities_12_systems                     1.02    153.4±7.77µs        ? ?/sec      1.00    150.9±5.58µs        ? ?/sec
busy_systems/01x_entities_15_systems                     1.00    187.9±6.60µs        ? ?/sec      1.04    194.8±7.09µs        ? ?/sec
busy_systems/02x_entities_03_systems                     1.30     74.4±3.74µs        ? ?/sec      1.00     57.3±5.62µs        ? ?/sec
busy_systems/02x_entities_06_systems                     1.08    140.7±8.57µs        ? ?/sec      1.00    129.9±6.40µs        ? ?/sec
busy_systems/02x_entities_09_systems                     1.00    217.6±8.97µs        ? ?/sec      1.05   227.7±17.53µs        ? ?/sec
busy_systems/02x_entities_12_systems                     1.00   278.7±11.11µs        ? ?/sec      1.08   301.8±14.38µs        ? ?/sec
busy_systems/02x_entities_15_systems                     1.00   340.7±20.27µs        ? ?/sec      1.03   351.4±14.16µs        ? ?/sec
busy_systems/03x_entities_03_systems                     1.00    105.7±6.43µs        ? ?/sec      1.04   109.5±11.64µs        ? ?/sec
busy_systems/03x_entities_06_systems                     1.22   224.8±13.17µs        ? ?/sec      1.00   184.4±10.85µs        ? ?/sec
busy_systems/03x_entities_09_systems                     1.05   327.2±13.83µs        ? ?/sec      1.00   311.6±15.62µs        ? ?/sec
busy_systems/03x_entities_12_systems                     1.00   420.3±15.97µs        ? ?/sec      1.01   424.5±21.19µs        ? ?/sec
busy_systems/03x_entities_15_systems                     1.03   484.9±18.26µs        ? ?/sec      1.00   470.1±13.92µs        ? ?/sec
busy_systems/04x_entities_03_systems                     1.28    135.7±8.19µs        ? ?/sec      1.00    106.1±6.32µs        ? ?/sec
busy_systems/04x_entities_06_systems                     1.19   294.1±11.13µs        ? ?/sec      1.00   246.2±19.85µs        ? ?/sec
busy_systems/04x_entities_09_systems                     1.03   434.4±19.06µs        ? ?/sec      1.00   423.7±36.26µs        ? ?/sec
busy_systems/04x_entities_12_systems                     1.00   537.1±31.11µs        ? ?/sec      1.05   564.6±39.19µs        ? ?/sec
busy_systems/04x_entities_15_systems                     1.00   625.7±30.09µs        ? ?/sec      1.01   634.0±27.91µs        ? ?/sec
busy_systems/05x_entities_03_systems                     1.01   176.1±12.71µs        ? ?/sec      1.00   173.5±20.44µs        ? ?/sec
busy_systems/05x_entities_06_systems                     1.05   352.2±26.54µs        ? ?/sec      1.00   334.8±35.01µs        ? ?/sec
busy_systems/05x_entities_09_systems                     1.02   547.8±22.79µs        ? ?/sec      1.00   534.8±23.93µs        ? ?/sec
busy_systems/05x_entities_12_systems                     1.00   683.8±48.92µs        ? ?/sec      1.04   713.8±43.14µs        ? ?/sec
busy_systems/05x_entities_15_systems                     1.00   867.3±42.16µs        ? ?/sec      1.04   905.5±65.56µs        ? ?/sec
contrived/01x_entities_03_systems                        1.18     28.2±0.70µs        ? ?/sec      1.00     23.8±1.89µs        ? ?/sec
contrived/01x_entities_06_systems                        1.03     52.6±2.18µs        ? ?/sec      1.00     51.3±3.55µs        ? ?/sec
contrived/01x_entities_09_systems                        1.02     78.4±4.73µs        ? ?/sec      1.00     76.8±4.15µs        ? ?/sec
contrived/01x_entities_12_systems                        1.06    101.5±6.61µs        ? ?/sec      1.00     95.7±3.57µs        ? ?/sec
contrived/01x_entities_15_systems                        1.00    125.0±5.25µs        ? ?/sec      1.00    124.5±8.04µs        ? ?/sec
contrived/02x_entities_03_systems                        1.00     41.6±1.53µs        ? ?/sec      1.04     43.5±2.05µs        ? ?/sec
contrived/02x_entities_06_systems                        1.00     81.1±2.24µs        ? ?/sec      1.00     81.2±3.51µs        ? ?/sec
contrived/02x_entities_09_systems                        1.00    116.2±5.09µs        ? ?/sec      1.06    122.9±4.43µs        ? ?/sec
contrived/02x_entities_12_systems                        1.00    149.3±4.09µs        ? ?/sec      1.06    159.0±7.20µs        ? ?/sec
contrived/02x_entities_15_systems                        1.00    191.2±8.23µs        ? ?/sec      1.01   193.2±10.28µs        ? ?/sec
contrived/03x_entities_03_systems                        1.00     56.3±2.24µs        ? ?/sec      1.03     58.1±5.22µs        ? ?/sec
contrived/03x_entities_06_systems                        1.00    111.7±5.10µs        ? ?/sec      1.01    113.4±8.22µs        ? ?/sec
contrived/03x_entities_09_systems                        1.00    149.9±5.70µs        ? ?/sec      1.04    156.1±7.67µs        ? ?/sec
contrived/03x_entities_12_systems                        1.00    198.6±7.92µs        ? ?/sec      1.07    212.1±9.89µs        ? ?/sec
contrived/03x_entities_15_systems                        1.00    242.0±9.53µs        ? ?/sec      1.07   258.8±17.68µs        ? ?/sec
contrived/04x_entities_03_systems                        1.00     67.7±3.02µs        ? ?/sec      1.09     73.7±4.02µs        ? ?/sec
contrived/04x_entities_06_systems                        1.01    136.9±6.27µs        ? ?/sec      1.00    135.0±5.74µs        ? ?/sec
contrived/04x_entities_09_systems                        1.00    190.6±5.42µs        ? ?/sec      1.04    197.8±5.62µs        ? ?/sec
contrived/04x_entities_12_systems                        1.00    238.8±6.75µs        ? ?/sec      1.01   240.3±10.04µs        ? ?/sec
contrived/04x_entities_15_systems                        1.00    290.7±8.65µs        ? ?/sec      1.00    291.2±8.13µs        ? ?/sec
contrived/05x_entities_03_systems                        1.11     88.5±3.29µs        ? ?/sec      1.00     79.5±2.46µs        ? ?/sec
contrived/05x_entities_06_systems                        1.01    158.7±5.37µs        ? ?/sec      1.00    156.9±4.30µs        ? ?/sec
contrived/05x_entities_09_systems                        1.00   229.2±13.21µs        ? ?/sec      1.02    234.7±6.38µs        ? ?/sec
contrived/05x_entities_12_systems                        1.00    285.3±6.02µs        ? ?/sec      1.06   302.8±14.85µs        ? ?/sec
contrived/05x_entities_15_systems                        1.00   345.2±14.09µs        ? ?/sec      1.10   379.8±27.06µs        ? ?/se
empty_commands/0_entities                                1.00      5.2±0.06ns        ? ?/sec      1.07      5.5±0.19ns        ? ?/sec
empty_systems/000_systems                                106.20     2.6±0.16µs        ? ?/sec     1.00     24.4±0.18ns        ? ?/sec
empty_systems/001_systems                                1.97      4.3±0.37µs        ? ?/sec      1.00      2.2±0.13µs        ? ?/sec
empty_systems/002_systems                                1.97      5.8±0.15µs        ? ?/sec      1.00      2.9±0.12µs        ? ?/sec
empty_systems/003_systems                                2.03      7.2±0.22µs        ? ?/sec      1.00      3.6±0.23µs        ? ?/sec
empty_systems/004_systems                                1.79      8.2±0.33µs        ? ?/sec      1.00      4.6±0.15µs        ? ?/sec
empty_systems/005_systems                                1.66      9.1±0.35µs        ? ?/sec      1.00      5.5±0.49µs        ? ?/sec
empty_systems/010_systems                                1.80     13.8±0.67µs        ? ?/sec      1.00      7.7±0.52µs        ? ?/sec
empty_systems/015_systems                                2.03     19.3±1.23µs        ? ?/sec      1.00      9.5±0.66µs        ? ?/sec
empty_systems/020_systems                                2.30     25.1±1.17µs        ? ?/sec      1.00     10.9±0.29µs        ? ?/sec
empty_systems/025_systems                                2.18     28.6±1.05µs        ? ?/sec      1.00     13.1±0.49µs        ? ?/sec
empty_systems/030_systems                                2.23     33.6±1.15µs        ? ?/sec      1.00     15.1±0.46µs        ? ?/sec
empty_systems/035_systems                                2.21     39.1±1.45µs        ? ?/sec      1.00     17.7±0.79µs        ? ?/sec
empty_systems/040_systems                                2.25     43.4±1.68µs        ? ?/sec      1.00     19.3±0.47µs        ? ?/sec
empty_systems/045_systems                                2.20     47.3±2.25µs        ? ?/sec      1.00     21.5±0.43µs        ? ?/sec
empty_systems/050_systems                                2.14     52.1±2.34µs        ? ?/sec      1.00     24.4±0.66µs        ? ?/sec
empty_systems/055_systems                                2.14     57.2±2.15µs        ? ?/sec      1.00     26.7±0.88µs        ? ?/sec
empty_systems/060_systems                                2.07     60.6±1.82µs        ? ?/sec      1.00     29.3±0.99µs        ? ?/sec
empty_systems/065_systems                                2.02     64.1±2.33µs        ? ?/sec      1.00     31.8±0.88µs        ? ?/sec
empty_systems/070_systems                                2.08     70.9±2.74µs        ? ?/sec      1.00     34.0±1.22µs        ? ?/sec
empty_systems/075_systems                                2.06     75.8±2.61µs        ? ?/sec      1.00     36.8±1.36µs        ? ?/sec
empty_systems/080_systems                                2.16     79.0±3.53µs        ? ?/sec      1.00     36.6±1.51µs        ? ?/sec
empty_systems/085_systems                                2.11     84.5±2.59µs        ? ?/sec      1.00     40.1±1.28µs        ? ?/sec
empty_systems/090_systems                                2.18     87.8±3.49µs        ? ?/sec      1.00     40.4±2.25µs        ? ?/sec
empty_systems/095_systems                                2.22     95.0±3.56µs        ? ?/sec      1.00     42.8±1.91µs        ? ?/sec
empty_systems/100_systems                                2.17     99.4±4.07µs        ? ?/sec      1.00     45.8±2.64µs        ? ?/sec
for_each_iter                                            1.00     27.3±0.53ms        ? ?/sec      1.00     27.4±0.29ms        ? ?/sec
for_each_par_iter/threads/1                              2.00     34.9±2.70ms        ? ?/sec      1.00     17.5±0.72ms        ? ?/sec
for_each_par_iter/threads/16                             1.31      4.8±0.21ms        ? ?/sec      1.00      3.6±0.08ms        ? ?/sec
for_each_par_iter/threads/2                              1.20     21.0±0.71ms        ? ?/sec      1.00     17.5±0.90ms        ? ?/sec
for_each_par_iter/threads/32                             2.27      5.0±0.08ms        ? ?/sec      1.00      2.2±0.05ms        ? ?/sec
for_each_par_iter/threads/4                              1.22     13.1±0.89ms        ? ?/sec      1.00     10.7±0.28ms        ? ?/sec
for_each_par_iter/threads/8                              1.17      7.6±0.35ms        ? ?/sec      1.00      6.5±0.09ms        ? ?/sec
many_maps_iter                                           1.00     27.2±0.14ms        ? ?/sec      1.01     27.4±0.14ms        ? ?/sec
many_maps_par_iter/threads/1                             1.00     17.6±1.18ms        ? ?/sec      1.00     17.5±0.72ms        ? ?/sec
many_maps_par_iter/threads/16                            1.00      2.2±0.05ms        ? ?/sec      1.61      3.6±0.03ms        ? ?/sec
many_maps_par_iter/threads/2                             1.00     10.5±0.40ms        ? ?/sec      1.66     17.4±0.79ms        ? ?/sec
many_maps_par_iter/threads/32                            1.00      2.1±0.03ms        ? ?/sec      1.01      2.1±0.04ms        ? ?/sec
many_maps_par_iter/threads/4                             1.00      6.5±0.20ms        ? ?/sec      1.65     10.7±0.23ms        ? ?/sec
many_maps_par_iter/threads/8                             1.00      3.7±0.08ms        ? ?/sec      1.77      6.5±0.07ms        ? ?/sec
no_archetypes/system_count/0                             62.58 1523.0±314.34ns        ? ?/sec     1.00     24.3±0.23ns        ? ?/sec
no_archetypes/system_count/100                           2.23     99.5±5.50µs        ? ?/sec      1.00     44.7±2.02µs        ? ?/sec
no_archetypes/system_count/20                            2.11     24.3±1.58µs        ? ?/sec      1.00     11.5±0.60µs        ? ?/sec
no_archetypes/system_count/40                            1.98     41.4±2.24µs        ? ?/sec      1.00     20.9±1.18µs        ? ?/sec
no_archetypes/system_count/60                            2.22     64.0±3.55µs        ? ?/sec      1.00     28.9±1.95µs        ? ?/sec
no_archetypes/system_count/80                            2.13     81.1±4.90µs        ? ?/sec      1.00     38.0±1.91µs        ? ?/sec
overhead_par_iter/threads/1                              2.03     45.9±3.65µs        ? ?/sec      1.00     22.7±1.34µs        ? ?/sec
overhead_par_iter/threads/16                             2.99     81.8±7.66µs        ? ?/sec      1.00     27.3±1.38µs        ? ?/sec
overhead_par_iter/threads/2                              2.41     53.0±2.80µs        ? ?/sec      1.00     22.0±0.90µs        ? ?/sec
overhead_par_iter/threads/32                             3.03     86.2±2.74µs        ? ?/sec      1.00     28.4±1.07µs        ? ?/sec
overhead_par_iter/threads/4                              2.41     70.2±4.63µs        ? ?/sec      1.00     29.2±1.61µs        ? ?/sec
overhead_par_iter/threads/8                              3.43     83.8±4.04µs        ? ?/sec      1.00     24.4±1.56µs        ? ?/sec
run_criteria/no/001_systems                              1.00  1429.0±128.56ns        ? ?/sec     1.83      2.6±0.61µs        ? ?/sec
run_criteria/no/006_systems                              1.00  1880.9±138.02ns        ? ?/sec     1.04  1954.6±492.52ns        ? ?/sec
run_criteria/no/011_systems                              1.00  1567.0±52.07ns        ? ?/sec      1.01  1589.7±158.57ns        ? ?/sec
run_criteria/no/016_systems                              1.06  1626.9±141.83ns        ? ?/sec     1.00  1535.3±97.05ns        ? ?/sec
run_criteria/no/021_systems                              1.00  1700.6±43.36ns        ? ?/sec      1.08  1844.2±212.39ns        ? ?/sec
run_criteria/no/026_systems                              1.00  1852.0±46.34ns        ? ?/sec      1.00  1850.4±299.14ns        ? ?/sec
run_criteria/no/031_systems                              1.00  1970.4±65.72ns        ? ?/sec      1.12      2.2±0.35µs        ? ?/sec
run_criteria/no/036_systems                              1.00      2.1±0.08µs        ? ?/sec      1.52      3.3±1.14µs        ? ?/sec
run_criteria/no/041_systems                              1.00      2.3±0.10µs        ? ?/sec      1.48      3.4±1.11µs        ? ?/sec
run_criteria/no/046_systems                              1.00      2.4±0.08µs        ? ?/sec      1.51      3.7±1.30µs        ? ?/sec
run_criteria/no/051_systems                              1.00      3.0±0.52µs        ? ?/sec      1.75      5.3±2.46µs        ? ?/sec
run_criteria/no/056_systems                              1.00      3.6±0.79µs        ? ?/sec      1.59      5.8±2.16µs        ? ?/sec
run_criteria/no/061_systems                              1.00      4.3±1.09µs        ? ?/sec      1.55      6.7±3.22µs        ? ?/sec
run_criteria/no/066_systems                              1.00      5.3±1.11µs        ? ?/sec      1.24      6.6±2.75µs        ? ?/sec
run_criteria/no/071_systems                              1.00      4.6±1.34µs        ? ?/sec      1.51      7.0±3.20µs        ? ?/sec
run_criteria/no/076_systems                              1.00      5.9±1.78µs        ? ?/sec      1.44      8.6±3.39µs        ? ?/sec
run_criteria/no/081_systems                              1.00      7.5±2.08µs        ? ?/sec      1.35     10.1±4.03µs        ? ?/sec
run_criteria/no/086_systems                              1.00     11.0±2.36µs        ? ?/sec      1.16     12.8±3.28µs        ? ?/sec
run_criteria/no/091_systems                              1.00     12.3±1.90µs        ? ?/sec      1.27     15.7±1.71µs        ? ?/sec
run_criteria/no/096_systems                              1.00     13.0±1.64µs        ? ?/sec      1.21     15.7±1.88µs        ? ?/sec
run_criteria/no/101_systems                              1.00     15.5±1.61µs        ? ?/sec      1.10     17.0±1.75µs        ? ?/sec
run_criteria/no_with_labels/001_systems                  1.00  1342.6±55.58ns        ? ?/sec      1.12  1500.9±286.27ns        ? ?/sec
run_criteria/no_with_labels/006_systems                  1.33  1840.7±158.89ns        ? ?/sec     1.00  1380.4±186.00ns        ? ?/sec
run_criteria/no_with_labels/011_systems                  1.07  1561.0±101.44ns        ? ?/sec     1.00  1464.4±129.83ns        ? ?/sec
run_criteria/no_with_labels/016_systems                  1.00  1450.3±69.17ns        ? ?/sec      1.04  1510.7±102.20ns        ? ?/sec
run_criteria/no_with_labels/021_systems                  1.11  1790.6±140.99ns        ? ?/sec     1.00  1613.6±266.62ns        ? ?/sec
run_criteria/no_with_labels/026_systems                  1.08  1691.0±39.38ns        ? ?/sec      1.00  1570.4±105.43ns        ? ?/sec
run_criteria/no_with_labels/031_systems                  1.00  1806.5±106.99ns        ? ?/sec     1.14      2.1±0.30µs        ? ?/sec
run_criteria/no_with_labels/036_systems                  1.00      2.0±0.12µs        ? ?/sec      1.00      2.0±0.34µs        ? ?/sec
run_criteria/no_with_labels/041_systems                  1.00      2.2±0.12µs        ? ?/sec      1.01      2.2±1.19µs        ? ?/sec
run_criteria/no_with_labels/046_systems                  1.04      2.3±0.10µs        ? ?/sec      1.00      2.2±0.27µs        ? ?/sec
run_criteria/no_with_labels/051_systems                  1.00      2.2±0.09µs        ? ?/sec      1.09      2.4±0.50µs        ? ?/sec
run_criteria/no_with_labels/056_systems                  1.00      2.6±0.41µs        ? ?/sec      1.14      3.0±1.66µs        ? ?/sec
run_criteria/no_with_labels/061_systems                  1.00      2.7±0.27µs        ? ?/sec      1.45      3.9±2.01µs        ? ?/sec
run_criteria/no_with_labels/066_systems                  1.00      2.8±0.26µs        ? ?/sec      1.51      4.2±2.10µs        ? ?/sec
run_criteria/no_with_labels/071_systems                  1.00      3.2±0.37µs        ? ?/sec      1.38      4.4±1.52µs        ? ?/sec
run_criteria/no_with_labels/076_systems                  1.00      4.1±0.72µs        ? ?/sec      1.19      4.9±1.79µs        ? ?/sec
run_criteria/no_with_labels/081_systems                  1.00      4.7±0.94µs        ? ?/sec      1.22      5.7±2.43µs        ? ?/sec
run_criteria/no_with_labels/086_systems                  1.00      5.3±1.62µs        ? ?/sec      1.28      6.8±3.01µs        ? ?/sec
run_criteria/no_with_labels/091_systems                  1.00      5.6±1.43µs        ? ?/sec      1.31      7.3±3.01µs        ? ?/sec
run_criteria/no_with_labels/096_systems                  1.00      6.3±1.65µs        ? ?/sec      1.18      7.5±3.16µs        ? ?/sec
run_criteria/no_with_labels/101_systems                  1.00      7.5±2.31µs        ? ?/sec      1.52     11.4±3.80µs        ? ?/sec
run_criteria/yes/001_systems                             1.84      5.9±0.42µs        ? ?/sec      1.00      3.2±0.17µs        ? ?/sec
run_criteria/yes/006_systems                             1.80     12.3±1.20µs        ? ?/sec      1.00      6.8±0.25µs        ? ?/sec
run_criteria/yes/011_systems                             1.82     17.9±1.65µs        ? ?/sec      1.00      9.8±0.34µs        ? ?/sec
run_criteria/yes/016_systems                             1.83     23.4±2.54µs        ? ?/sec      1.00     12.8±0.60µs        ? ?/sec
run_criteria/yes/021_systems                             1.78     27.2±2.86µs        ? ?/sec      1.00     15.3±0.44µs        ? ?/sec
run_criteria/yes/026_systems                             1.88     33.7±2.31µs        ? ?/sec      1.00     17.9±0.75µs        ? ?/sec
run_criteria/yes/031_systems                             1.89     38.5±2.82µs        ? ?/sec      1.00     20.4±0.46µs        ? ?/sec
run_criteria/yes/036_systems                             1.92     41.5±3.91µs        ? ?/sec      1.00     21.6±0.80µs        ? ?/sec
run_criteria/yes/041_systems                             1.90     47.3±4.65µs        ? ?/sec      1.00     24.9±0.79µs        ? ?/sec
run_criteria/yes/046_systems                             1.91     53.2±3.36µs        ? ?/sec      1.00     27.8±1.53µs        ? ?/sec
run_criteria/yes/051_systems                             1.80     55.8±4.93µs        ? ?/sec      1.00     30.9±1.98µs        ? ?/sec
run_criteria/yes/056_systems                             1.86     60.8±3.97µs        ? ?/sec      1.00     32.6±1.32µs        ? ?/sec
run_criteria/yes/061_systems                             1.81     62.8±5.42µs        ? ?/sec      1.00     34.7±0.93µs        ? ?/sec
run_criteria/yes/066_systems                             1.83     66.9±7.21µs        ? ?/sec      1.00     36.6±1.16µs        ? ?/sec
run_criteria/yes/071_systems                             1.94     72.7±6.34µs        ? ?/sec      1.00     37.4±1.39µs        ? ?/sec
run_criteria/yes/076_systems                             1.90     74.2±6.22µs        ? ?/sec      1.00     39.1±0.89µs        ? ?/sec
run_criteria/yes/081_systems                             1.90     79.1±5.81µs        ? ?/sec      1.00     41.7±1.42µs        ? ?/sec
run_criteria/yes/086_systems                             2.02     87.6±5.72µs        ? ?/sec      1.00     43.3±1.04µs        ? ?/sec
run_criteria/yes/091_systems                             1.82     86.5±6.30µs        ? ?/sec      1.00     47.5±1.06µs        ? ?/sec
run_criteria/yes/096_systems                             1.78     90.0±5.66µs        ? ?/sec      1.00     50.6±1.52µs        ? ?/sec
run_criteria/yes/101_systems                             1.85     96.6±8.29µs        ? ?/sec      1.00     52.2±2.11µs        ? ?/sec
run_criteria/yes_using_query/001_systems                 1.80      6.2±0.22µs        ? ?/sec      1.00      3.5±0.14µs        ? ?/sec
run_criteria/yes_using_query/006_systems                 1.89     12.8±0.38µs        ? ?/sec      1.00      6.8±0.16µs        ? ?/sec
run_criteria/yes_using_query/011_systems                 1.92     18.4±1.22µs        ? ?/sec      1.00      9.6±0.24µs        ? ?/sec
run_criteria/yes_using_query/016_systems                 1.92     24.0±2.52µs        ? ?/sec      1.00     12.5±0.53µs        ? ?/sec
run_criteria/yes_using_query/021_systems                 1.84     28.4±2.53µs        ? ?/sec      1.00     15.4±0.47µs        ? ?/sec
run_criteria/yes_using_query/026_systems                 1.91     33.3±2.84µs        ? ?/sec      1.00     17.4±0.43µs        ? ?/sec
run_criteria/yes_using_query/031_systems                 1.98     38.7±1.96µs        ? ?/sec      1.00     19.5±0.29µs        ? ?/sec
run_criteria/yes_using_query/036_systems                 2.00     42.7±2.93µs        ? ?/sec      1.00     21.4±0.48µs        ? ?/sec
run_criteria/yes_using_query/041_systems                 1.93     48.1±3.20µs        ? ?/sec      1.00     25.0±0.47µs        ? ?/sec
run_criteria/yes_using_query/046_systems                 1.89     51.1±3.71µs        ? ?/sec      1.00     27.0±0.42µs        ? ?/sec
run_criteria/yes_using_query/051_systems                 1.93     57.0±4.18µs        ? ?/sec      1.00     29.5±0.78µs        ? ?/sec
run_criteria/yes_using_query/056_systems                 1.86     58.6±5.94µs        ? ?/sec      1.00     31.5±1.05µs        ? ?/sec
run_criteria/yes_using_query/061_systems                 1.74     62.6±5.36µs        ? ?/sec      1.00     36.0±0.54µs        ? ?/sec
run_criteria/yes_using_query/066_systems                 2.03     69.6±4.94µs        ? ?/sec      1.00     34.3±0.59µs        ? ?/sec
run_criteria/yes_using_query/071_systems                 1.97     73.0±6.70µs        ? ?/sec      1.00     37.1±0.94µs        ? ?/sec
run_criteria/yes_using_query/076_systems                 1.92     76.1±8.62µs        ? ?/sec      1.00     39.7±1.46µs        ? ?/sec
run_criteria/yes_using_query/081_systems                 2.02     81.9±7.86µs        ? ?/sec      1.00     40.6±0.95µs        ? ?/sec
run_criteria/yes_using_query/086_systems                 1.84     82.8±8.81µs        ? ?/sec      1.00     45.0±1.81µs        ? ?/sec
run_criteria/yes_using_query/091_systems                 1.91    86.8±10.23µs        ? ?/sec      1.00     45.4±1.68µs        ? ?/sec
run_criteria/yes_using_query/096_systems                 1.85     90.9±6.76µs        ? ?/sec      1.00     49.2±1.61µs        ? ?/sec
run_criteria/yes_using_query/101_systems                 1.89     94.0±8.51µs        ? ?/sec      1.00     49.8±1.39µs        ? ?/sec
run_criteria/yes_using_resource/001_systems              1.97      6.0±0.29µs        ? ?/sec      1.00      3.0±0.11µs        ? ?/sec
run_criteria/yes_using_resource/006_systems              1.80     12.2±0.74µs        ? ?/sec      1.00      6.8±0.13µs        ? ?/sec
run_criteria/yes_using_resource/011_systems              1.81     17.8±1.95µs        ? ?/sec      1.00      9.8±0.37µs        ? ?/sec
run_criteria/yes_using_resource/016_systems              1.85     23.5±2.12µs        ? ?/sec      1.00     12.7±0.29µs        ? ?/sec
run_criteria/yes_using_resource/021_systems              1.81     27.8±2.66µs        ? ?/sec      1.00     15.4±0.26µs        ? ?/sec
run_criteria/yes_using_resource/026_systems              1.94     33.5±2.79µs        ? ?/sec      1.00     17.3±0.37µs        ? ?/sec
run_criteria/yes_using_resource/031_systems              1.96     38.4±3.51µs        ? ?/sec      1.00     19.6±0.19µs        ? ?/sec
run_criteria/yes_using_resource/036_systems              2.00     42.2±3.24µs        ? ?/sec      1.00     21.1±0.32µs        ? ?/sec
run_criteria/yes_using_resource/041_systems              1.86     47.0±3.85µs        ? ?/sec      1.00     25.2±0.43µs        ? ?/sec
run_criteria/yes_using_resource/046_systems              1.92     51.3±3.60µs        ? ?/sec      1.00     26.7±0.49µs        ? ?/sec
run_criteria/yes_using_resource/051_systems              1.92     54.7±5.04µs        ? ?/sec      1.00     28.5±0.49µs        ? ?/sec
run_criteria/yes_using_resource/056_systems              1.97     59.9±6.51µs        ? ?/sec      1.00     30.5±0.42µs        ? ?/sec
run_criteria/yes_using_resource/061_systems              1.93     62.6±7.94µs        ? ?/sec      1.00     32.4±0.35µs        ? ?/sec
run_criteria/yes_using_resource/066_systems              2.02     67.7±5.80µs        ? ?/sec      1.00     33.5±0.29µs        ? ?/sec
run_criteria/yes_using_resource/071_systems              1.97     71.4±5.93µs        ? ?/sec      1.00     36.2±0.46µs        ? ?/sec
run_criteria/yes_using_resource/076_systems              2.09     80.5±7.30µs        ? ?/sec      1.00     38.4±0.55µs        ? ?/sec
run_criteria/yes_using_resource/081_systems              2.02     79.6±5.45µs        ? ?/sec      1.00     39.3±0.51µs        ? ?/sec
run_criteria/yes_using_resource/086_systems              2.01     84.9±6.54µs        ? ?/sec      1.00     42.2±0.64µs        ? ?/sec
run_criteria/yes_using_resource/091_systems              2.03     85.3±6.39µs        ? ?/sec      1.00     42.1±0.93µs        ? ?/sec
run_criteria/yes_using_resource/096_systems              1.92     89.6±7.13µs        ? ?/sec      1.00     46.7±0.82µs        ? ?/sec
run_criteria/yes_using_resource/101_systems              1.77     92.3±5.49µs        ? ?/sec      1.00     52.2±1.05µs        ? ?/sec
run_criteria/yes_with_labels/001_systems                 2.04      5.9±0.17µs        ? ?/sec      1.00      2.9±0.16µs        ? ?/sec
run_criteria/yes_with_labels/006_systems                 1.58     11.0±0.69µs        ? ?/sec      1.00      7.0±0.47µs        ? ?/sec
run_criteria/yes_with_labels/011_systems                 1.73     16.2±1.53µs        ? ?/sec      1.00      9.4±0.28µs        ? ?/sec
run_criteria/yes_with_labels/016_systems                 1.64     20.9±1.89µs        ? ?/sec      1.00     12.7±0.43µs        ? ?/sec
run_criteria/yes_with_labels/021_systems                 1.64     25.2±2.47µs        ? ?/sec      1.00     15.4±0.37µs        ? ?/sec
run_criteria/yes_with_labels/026_systems                 1.75     29.8±1.84µs        ? ?/sec      1.00     17.0±0.47µs        ? ?/sec
run_criteria/yes_with_labels/031_systems                 1.71     33.2±2.60µs        ? ?/sec      1.00     19.4±0.42µs        ? ?/sec
run_criteria/yes_with_labels/036_systems                 1.73     37.4±2.68µs        ? ?/sec      1.00     21.6±0.41µs        ? ?/sec
run_criteria/yes_with_labels/041_systems                 1.72     41.0±2.71µs        ? ?/sec      1.00     23.9±0.43µs        ? ?/sec
run_criteria/yes_with_labels/046_systems                 1.68     44.8±2.43µs        ? ?/sec      1.00     26.7±0.50µs        ? ?/sec
run_criteria/yes_with_labels/051_systems                 1.79     49.4±2.97µs        ? ?/sec      1.00     27.6±0.54µs        ? ?/sec
run_criteria/yes_with_labels/056_systems                 1.86     53.9±3.28µs        ? ?/sec      1.00     28.9±0.60µs        ? ?/sec
run_criteria/yes_with_labels/061_systems                 1.84     56.6±3.12µs        ? ?/sec      1.00     30.8±1.18µs        ? ?/sec
run_criteria/yes_with_labels/066_systems                 1.92     64.0±4.34µs        ? ?/sec      1.00     33.3±0.63µs        ? ?/sec
run_criteria/yes_with_labels/071_systems                 1.87     65.6±5.71µs        ? ?/sec      1.00     35.1±0.60µs        ? ?/sec
run_criteria/yes_with_labels/076_systems                 1.83     67.0±5.02µs        ? ?/sec      1.00     36.6±1.24µs        ? ?/sec
run_criteria/yes_with_labels/081_systems                 1.81     71.8±4.10µs        ? ?/sec      1.00     39.7±0.81µs        ? ?/sec
run_criteria/yes_with_labels/086_systems                 1.84     75.8±4.21µs        ? ?/sec      1.00     41.3±0.63µs        ? ?/sec
run_criteria/yes_with_labels/091_systems                 1.80     78.4±4.85µs        ? ?/sec      1.00     43.5±0.52µs        ? ?/sec
run_criteria/yes_with_labels/096_systems                 1.79     81.8±6.04µs        ? ?/sec      1.00     45.7±0.65µs        ? ?/sec
run_criteria/yes_with_labels/101_systems                 1.72     85.5±9.67µs        ? ?/sec      1.00     49.8±1.69µs        ? ?/sec
schedule/base                                            1.09     38.1±2.98µs        ? ?/sec      1.00     35.1±2.57µs        ? ?/sec

@james7132
Copy link
Member Author

Added a few other small, probably insignificant improvements:

  • Switched to using a bounded channel for signaling systems finishing. This switches it internally to use an array instead of a linked list, which avoids putting allocation/deallocation on the hotpath when listening for completed systems. The capacity is set to 128, which comes out to be ~1KB of memory and it will likely rarely be full as it would require over 128 systems to finish before the parallel executor reads from it. This should also speed up the CAS loop using try_recv with the tighter cache locality.
  • For systems that do have a dependency or could not start due to conflicting accesses, I dropped one level below async_channel and directly use event_listener instead, which should remove the unneeded write to the zero-size concurrent queue.
  • Changed the check before starting the parallel scheduler to check if should_run has any systems to run at all. This adds maybe a couple hundred nanoseconds of overhead to avoid scheduling the parallel executor.

Copy link
Member

@alice-i-cecile alice-i-cecile left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some comments on code clarity. I'd like to ensure that this tricky logic stays relatively approachable, so I'm applying a heightened standard of review.

The comment about the "don't queue up tasks if the system can already start" change is the most critical; the logical flow is very convoluted there, and I think we should reshuffle this significantly in order to ensure that it's easy to read the branches.

crates/bevy_ecs/src/schedule/executor_parallel.rs Outdated Show resolved Hide resolved
crates/bevy_ecs/src/schedule/executor_parallel.rs Outdated Show resolved Hide resolved
crates/bevy_ecs/src/schedule/executor_parallel.rs Outdated Show resolved Hide resolved
crates/bevy_ecs/src/schedule/executor_parallel.rs Outdated Show resolved Hide resolved
Copy link
Contributor

@inodentry inodentry left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I read through the code as thoroughly as I could, and familiarized myself with the dependencies fixedbitset and event-listener involved. :)

Everything seems to make sense. I didn't notice anything that seemed wrong.

Got a few small ideas for further potential improvements/tweaks to explore, but I'll keep quiet so we keep this PR well-scoped and don't drag it on. 😆

@alice-i-cecile alice-i-cecile added the S-Ready-For-Final-Review This PR has been approved by the community. It's ready for a maintainer to consider merging it label Aug 8, 2022
@alice-i-cecile
Copy link
Member

@james7132 if you have a moment to rebase this I can merge it in :)

inodentry added a commit to BroovyJammy/bevy that referenced this pull request Aug 19, 2022
@alice-i-cecile alice-i-cecile added the S-Adopt-Me The original PR author has no intent to complete this work. Pick me up! label Sep 3, 2022
@alice-i-cecile
Copy link
Member

Adding Adopt-Me to help lighten your load; feel free to remove the label if you want to pick this up yourself again James :)

@james7132 james7132 removed the S-Adopt-Me The original PR author has no intent to complete this work. Pick me up! label Sep 13, 2022
@alice-i-cecile
Copy link
Member

bors r+

bors bot pushed a commit that referenced this pull request Sep 13, 2022
# Objective
While using the ParallelExecutor, systems do not actually start until `prepare_systems` completes. In stages where there are large numbers of "empty" systems with very little work to do, this delay adds significant overhead, which can add up over many stages.

## Solution
Immediately and synchronously signal the start of systems that can run without dependencies inside `prepare_systems` instead of waiting for the first executor iteration after `prepare_systems` completes. Any system that is dependent on them still cannot run until after `prepare_systems` completes, but there are a large number of unconstrained systems in the base engine where this is a general benefit in almost every case.

## Performance

This change was tested against `many_foxes` in the default configuration. As this change is sensitive to the overhead around scheduling systems, the spans for measuring system timing, system overhead, and system commands were all commented out for these measurements.

The median stage timings between `main` and this PR are as follows:

|stage|main|this PR|
|:--|:--|:--|
|First|75.54 us|61.61 us|
|LoadAssets|51.05 us|42.32 us|
|PreUpdate|54.6 us|55.56 us|
|Update|61.89 us|51.5 us|
|PostUpdate|7.27 ms|6.71 ms|
|AssetEvents|47.82 us|35.95 us|
|Last|39.19 us|37.71 us|
|reserve_and_flush|57.83 us|48.2 us|
|Extract|1.41 ms|1.28 ms|
|Prepare|554.49 us|502.53 us|
|Queue|216.29 us|207.51 us|
|Sort|67.03 us|60.99 us|
|Render|1.73 ms|1.58 ms|
|Cleanup|33.55 us|30.76 us|
|Clear Entities|18.56 us|17.05 us|
|**full frame**|**11.9 ms**|**10.91 ms**|

For the first few stages, the benefit is small but cumulative over each. For PostUpdate in particular, this allows `parent_update` to run while prepare_systems is running, which is required for the animation and transform propagation systems, which dominate the time spent in the stage, but also frontloads the contention as the other "empty" systems are also running while `parent_update` is running. For Render, where there is just a single large exclusive system, the benefit comes from not waiting on a spuriously scheduled task on the task pool to kick off the system: it's immediately scheduled to run.
@bors bors bot changed the title Start running systems while prepare_systems is running [Merged by Bors] - Start running systems while prepare_systems is running Sep 13, 2022
@bors bors bot closed this Sep 13, 2022
james7132 added a commit to james7132/bevy that referenced this pull request Oct 19, 2022
# Objective
While using the ParallelExecutor, systems do not actually start until `prepare_systems` completes. In stages where there are large numbers of "empty" systems with very little work to do, this delay adds significant overhead, which can add up over many stages.

## Solution
Immediately and synchronously signal the start of systems that can run without dependencies inside `prepare_systems` instead of waiting for the first executor iteration after `prepare_systems` completes. Any system that is dependent on them still cannot run until after `prepare_systems` completes, but there are a large number of unconstrained systems in the base engine where this is a general benefit in almost every case.

## Performance

This change was tested against `many_foxes` in the default configuration. As this change is sensitive to the overhead around scheduling systems, the spans for measuring system timing, system overhead, and system commands were all commented out for these measurements.

The median stage timings between `main` and this PR are as follows:

|stage|main|this PR|
|:--|:--|:--|
|First|75.54 us|61.61 us|
|LoadAssets|51.05 us|42.32 us|
|PreUpdate|54.6 us|55.56 us|
|Update|61.89 us|51.5 us|
|PostUpdate|7.27 ms|6.71 ms|
|AssetEvents|47.82 us|35.95 us|
|Last|39.19 us|37.71 us|
|reserve_and_flush|57.83 us|48.2 us|
|Extract|1.41 ms|1.28 ms|
|Prepare|554.49 us|502.53 us|
|Queue|216.29 us|207.51 us|
|Sort|67.03 us|60.99 us|
|Render|1.73 ms|1.58 ms|
|Cleanup|33.55 us|30.76 us|
|Clear Entities|18.56 us|17.05 us|
|**full frame**|**11.9 ms**|**10.91 ms**|

For the first few stages, the benefit is small but cumulative over each. For PostUpdate in particular, this allows `parent_update` to run while prepare_systems is running, which is required for the animation and transform propagation systems, which dominate the time spent in the stage, but also frontloads the contention as the other "empty" systems are also running while `parent_update` is running. For Render, where there is just a single large exclusive system, the benefit comes from not waiting on a spuriously scheduled task on the task pool to kick off the system: it's immediately scheduled to run.
james7132 added a commit to james7132/bevy that referenced this pull request Oct 28, 2022
# Objective
While using the ParallelExecutor, systems do not actually start until `prepare_systems` completes. In stages where there are large numbers of "empty" systems with very little work to do, this delay adds significant overhead, which can add up over many stages.

## Solution
Immediately and synchronously signal the start of systems that can run without dependencies inside `prepare_systems` instead of waiting for the first executor iteration after `prepare_systems` completes. Any system that is dependent on them still cannot run until after `prepare_systems` completes, but there are a large number of unconstrained systems in the base engine where this is a general benefit in almost every case.

## Performance

This change was tested against `many_foxes` in the default configuration. As this change is sensitive to the overhead around scheduling systems, the spans for measuring system timing, system overhead, and system commands were all commented out for these measurements.

The median stage timings between `main` and this PR are as follows:

|stage|main|this PR|
|:--|:--|:--|
|First|75.54 us|61.61 us|
|LoadAssets|51.05 us|42.32 us|
|PreUpdate|54.6 us|55.56 us|
|Update|61.89 us|51.5 us|
|PostUpdate|7.27 ms|6.71 ms|
|AssetEvents|47.82 us|35.95 us|
|Last|39.19 us|37.71 us|
|reserve_and_flush|57.83 us|48.2 us|
|Extract|1.41 ms|1.28 ms|
|Prepare|554.49 us|502.53 us|
|Queue|216.29 us|207.51 us|
|Sort|67.03 us|60.99 us|
|Render|1.73 ms|1.58 ms|
|Cleanup|33.55 us|30.76 us|
|Clear Entities|18.56 us|17.05 us|
|**full frame**|**11.9 ms**|**10.91 ms**|

For the first few stages, the benefit is small but cumulative over each. For PostUpdate in particular, this allows `parent_update` to run while prepare_systems is running, which is required for the animation and transform propagation systems, which dominate the time spent in the stage, but also frontloads the contention as the other "empty" systems are also running while `parent_update` is running. For Render, where there is just a single large exclusive system, the benefit comes from not waiting on a spuriously scheduled task on the task pool to kick off the system: it's immediately scheduled to run.
ItsDoot pushed a commit to ItsDoot/bevy that referenced this pull request Feb 1, 2023
# Objective
While using the ParallelExecutor, systems do not actually start until `prepare_systems` completes. In stages where there are large numbers of "empty" systems with very little work to do, this delay adds significant overhead, which can add up over many stages.

## Solution
Immediately and synchronously signal the start of systems that can run without dependencies inside `prepare_systems` instead of waiting for the first executor iteration after `prepare_systems` completes. Any system that is dependent on them still cannot run until after `prepare_systems` completes, but there are a large number of unconstrained systems in the base engine where this is a general benefit in almost every case.

## Performance

This change was tested against `many_foxes` in the default configuration. As this change is sensitive to the overhead around scheduling systems, the spans for measuring system timing, system overhead, and system commands were all commented out for these measurements.

The median stage timings between `main` and this PR are as follows:

|stage|main|this PR|
|:--|:--|:--|
|First|75.54 us|61.61 us|
|LoadAssets|51.05 us|42.32 us|
|PreUpdate|54.6 us|55.56 us|
|Update|61.89 us|51.5 us|
|PostUpdate|7.27 ms|6.71 ms|
|AssetEvents|47.82 us|35.95 us|
|Last|39.19 us|37.71 us|
|reserve_and_flush|57.83 us|48.2 us|
|Extract|1.41 ms|1.28 ms|
|Prepare|554.49 us|502.53 us|
|Queue|216.29 us|207.51 us|
|Sort|67.03 us|60.99 us|
|Render|1.73 ms|1.58 ms|
|Cleanup|33.55 us|30.76 us|
|Clear Entities|18.56 us|17.05 us|
|**full frame**|**11.9 ms**|**10.91 ms**|

For the first few stages, the benefit is small but cumulative over each. For PostUpdate in particular, this allows `parent_update` to run while prepare_systems is running, which is required for the animation and transform propagation systems, which dominate the time spent in the stage, but also frontloads the contention as the other "empty" systems are also running while `parent_update` is running. For Render, where there is just a single large exclusive system, the benefit comes from not waiting on a spuriously scheduled task on the task pool to kick off the system: it's immediately scheduled to run.
bors bot pushed a commit that referenced this pull request Feb 27, 2023
# Objective
This is a follow-up to #7745. An unbounded `async_channel`  occasionally allocates whenever it exceeds the capacity of the current buffer in it's internal linked list. This is avoidable.

This also used to be a bounded channel before stageless, which was introduced in #4919.

## Solution
Use a bounded channel to avoid allocations on system completion.

This shouldn't conflict with #7745, as it's impossible for the scheduler to exceed the channel capacity, even if somehow every system completed at the same time.
bors bot pushed a commit that referenced this pull request Feb 27, 2023
# Objective
This is a follow-up to #7745. An unbounded `async_channel`  occasionally allocates whenever it exceeds the capacity of the current buffer in it's internal linked list. This is avoidable.

This also used to be a bounded channel before stageless, which was introduced in #4919.

## Solution
Use a bounded channel to avoid allocations on system completion.

This shouldn't conflict with #7745, as it's impossible for the scheduler to exceed the channel capacity, even if somehow every system completed at the same time.
@james7132 james7132 deleted the start-in-prepare-systems branch March 14, 2023 04:15
Shfty pushed a commit to shfty-rust/bevy that referenced this pull request Mar 19, 2023
# Objective
This is a follow-up to bevyengine#7745. An unbounded `async_channel`  occasionally allocates whenever it exceeds the capacity of the current buffer in it's internal linked list. This is avoidable.

This also used to be a bounded channel before stageless, which was introduced in bevyengine#4919.

## Solution
Use a bounded channel to avoid allocations on system completion.

This shouldn't conflict with bevyengine#7745, as it's impossible for the scheduler to exceed the channel capacity, even if somehow every system completed at the same time.
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 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.

None yet

4 participants