Keep the following in mind when interpreting the benchmarks:
- The measurements represent avg/operation, except where this doesn't make sense. For example, the reported time for an
add_remove_16_tagsbenchmark should be read as(add_time + remove_time) / (2 * 16). - Each benchmark runs for a fixed amount of time, and counts how often the benchmarked operations ran in that time.
- The purpose of these benchmarks is to track performance regressions, and to enable others to write and test performance optimizations for Flecs. They intentionally measure as little as possible, and do not reflect real-life scenarios.
- The filter/query iterator tests are evaluated against a dataset with 2^N tables, where N is the reported number of tags/components. The tables are created by randomly adding N components to entities.
Use these commands to run the benchmarks:
# Recursively clean benchmark project and flecs dependency
bake clean -r
# Run benchmarks with optimizations enabled
bake run --cfg releaseFlecs can be found here: https://github.com/SanderMertens/flecs
Installation instructions for bake can be found here: https://github.com/SanderMertens/bake
Benchmarks were measured on a MacBook Pro M1 from 2021, with 64GB RAM
Release: https://github.com/SanderMertens/flecs/releases/tag/v3.2.10
ns = nanoseconds, us = microseconds, ms = milliseconds
| Benchmark | Measurement |
|---|---|
| world_mini_fini | 206.78us |
| world_init_fini | 951.31us |
| has_empty_entity | 1.56ns |
| has_id_not_found | 3.12ns |
| has_id | 4.06ns |
| has_16_ids | 4.42ns |
| get_empty_entity | 1.56ns |
| get_id_not_found | 4.07ns |
| get_id | 3.32ns |
| get_16_ids | 3.48ns |
| get_pair | 4.58ns |
| get_pair_16_targets | 4.73ns |
| get_inherited_depth_1 | 20.39ns |
| get_inherited_depth_2 | 31.58ns |
| get_inherited_depth_16 | 243.10ns |
| get_inherited_depth_32 | 545.01ns |
| get_mut_id | 6.87ns |
| get_mut_16_ids | 6.88ns |
| set_id | 12.19ns |
| set_16_ids | 12.66ns |
| get_mut_remove_id | 17.40ns |
| get_mut_remove_16_ids | 69.85ns |
| get_mut_remove_32_ids | 115.94ns |
| ref_init | 3.13ns |
| ref_get | 0.69ns |
| add_remove_1_tag | 15.22ns |
| add_remove_2_tags | 18.97ns |
| add_remove_16_tags | 23.13ns |
| add_remove_32_tags | 23.00ns |
| add_remove_1_component | 15.64ns |
| add_remove_2_components | 21.18ns |
| add_remove_16_components | 65.81ns |
| add_remove_32_components | 113.10ns |
| add_existing_1_tag | 7.01ns |
| add_existing_16_tags | 7.33ns |
| add_existing_1_component | 7.03ns |
| add_existing_16_components | 7.36ns |
| add_remove_tag_to_1_component | 26.23ns |
| add_remove_tag_to_4_components | 46.93ns |
| add_remove_tag_to_8_components | 72.40ns |
| add_remove_tag_to_16_components | 132.63ns |
| add_remove_tag_to_64_components | 441.22ns |
| add_remove_override_1 | 62.34ns |
| add_remove_override_2 | 66.54ns |
| add_remove_override_4 | 74.68ns |
| add_remove_override_16 | 116.88ns |
| add_remove_cmd_1_tag | 21.00ns |
| add_remove_cmd_2_tags | 19.32ns |
| add_remove_cmd_16_tags | 16.47ns |
| add_remove_cmd_32_tags | 15.93ns |
| add_remove_cmd_1_components | 21.91ns |
| add_remove_cmd_2_components | 20.91ns |
| add_remove_cmd_16_components | 17.76ns |
| add_remove_cmd_32_components | 17.23ns |
| get_mut_cmd_1 | 19.08ns |
| get_mut_cmd_2 | 19.02ns |
| get_mut_cmd_16 | 17.58ns |
| get_mut_cmd_32 | 17.55ns |
| set_cmd_1 | 33.39ns |
| set_cmd_2 | 34.81ns |
| set_cmd_16 | 33.44ns |
| set_cmd_32 | 33.09ns |
| get_mut_remove_cmd_1 | 27.07ns |
| get_mut_remove_cmd_2 | 28.37ns |
| get_mut_remove_cmd_16 | 24.74ns |
| get_mut_remove_cmd_32 | 23.86ns |
| add_remove_hooks_1 | 18.70ns |
| add_remove_hooks_2 | 29.44ns |
| add_remove_hooks_16 | 92.84ns |
| add_remove_hooks_32 | 157.10ns |
| create_100_w_add_in_observer | 113.63ns |
| create_1k_w_add_in_observer | 112.70ns |
| create_10k_w_add_in_observer | 114.86ns |
| create_50k_w_add_in_observer | 114.26ns |
| create_delete_empty | 4.03ns |
| create_delete_1_tag | 10.28ns |
| create_delete_2_tags | 13.37ns |
| create_delete_16_tags | 20.66ns |
| create_delete_1_component | 10.50ns |
| create_delete_2_components | 14.65ns |
| create_delete_16_components | 57.80ns |
| entity_init_delete | 12.48us |
| entity_init_w_name_delete | 12.47us |
| create_delete_tree_w1_d1 | 756.68ns |
| create_delete_tree_w1_d10 | 4.79us |
| create_delete_tree_w1_d100 | 50.70us |
| create_delete_tree_w1_d1000 | 547.29us |
| create_delete_tree_w10_d1 | 99.92ns |
| create_delete_tree_w10_d10 | 740.82ns |
| create_delete_tree_w10_d100 | 7.81us |
| create_delete_tree_w10_d1000 | 77.84us |
| create_delete_tree_w100_d1 | 28.74ns |
| create_delete_tree_w100_d10 | 277.38ns |
| create_delete_tree_w100_d100 | 2.91us |
| create_delete_tree_w100_d1000 | 29.59us |
| create_delete_tree_w1000_d1 | 21.17ns |
| create_delete_tree_w1000_d10 | 228.70ns |
| create_delete_tree_w1000_d100 | 2.30us |
| create_delete_tree_w1000_d1000 | 24.88us |
| change_parent | 23.32ns |
| change_parent_root | 15.15ns |
| change_parent_w_name | 98.38us |
| lookup_depth_0 | 39.50ns |
| lookup_depth_1 | 69.75ns |
| lookup_depth_10 | 355.33ns |
| lookup_depth_100 | 3.32us |
| set_name | 97.92ns |
| emit_0_observers | 22.88ns |
| emit_1_observer | 37.55ns |
| emit_10_observers | 71.71ns |
| emit_100_observers | 491.51ns |
| emit_propagate_depth_1 | 30.64ns |
| emit_propagate_depth_10 | 220.63ns |
| emit_propagate_depth_100 | 2.56us |
| emit_propagate_depth_1000 | 35.09us |
| emit_forward_1_ids_depth_1 | 143.31ns |
| emit_forward_1_ids_depth_1000 | 143.77ns |
| emit_forward_16_ids_depth_1 | 764.00ns |
| emit_forward_16_ids_depth_1000 | 760.70ns |
| modified_0_observers | 9.90ns |
| modified_1_observer | 48.26ns |
| modified_10_observers | 83.06ns |
| modified_100_observers | 501.19ns |
| filter_simple_iter_self_1_tags | 6.14us |
| filter_simple_iter_self_8_tags | 6.22us |
| filter_simple_iter_self_1_component | 6.15us |
| filter_simple_iter_self_8_components | 6.23us |
| filter_simple_iter_1_tags | 6.14us |
| filter_simple_iter_8_tags | 6.29us |
| filter_simple_iter_1_component | 6.15us |
| filter_simple_iter_8_components | 6.25us |
| filter_init_fini_1_ids | 62.71ns |
| filter_init_fini_8_ids | 301.91ns |
| filter_init_fini_16_ids | 560.54ns |
| filter_init_fini_inline_1_ids | 55.98ns |
| filter_init_fini_inline_8_ids | 295.27ns |
| filter_init_fini_inline_16_ids | 553.63ns |
| filter_iter_8_tags_1_term | 6.57us |
| filter_iter_8_tags_4_terms | 4.64us |
| filter_iter_16_tags_1_term | 1.27ms |
| filter_iter_16_tags_4_terms | 2.26ms |
| filter_iter_8_components_1_term | 6.94us |
| filter_iter_8_components_4_terms | 4.83us |
| filter_iter_16_components_1_term | 1.64ms |
| filter_iter_16_components_4_terms | 2.46ms |
| filter_iter_up_8_tags | 5.95ms |
| filter_iter_up_8_tags_w_self | 6.07ms |
| filter_iter_up_w_mut_8_tags | 6.01ms |
| filter_iter_up_w_mut_8_tags_w_self | 6.11ms |
| rule_init_fini_1_ids | 128.74ns |
| rule_init_fini_8_ids | 366.44ns |
| rule_init_fini_16_ids | 637.34ns |
| rule_simple_iter_self_1_tags | 6.16us |
| rule_simple_iter_self_8_tags | 6.23us |
| rule_simple_iter_self_1_component | 6.16us |
| rule_simple_iter_self_8_component | 6.25us |
| rule_simple_iter_1_tags | 6.16us |
| rule_simple_iter_8_tags | 6.17us |
| rule_simple_iter_1_component | 6.18us |
| rule_simple_iter_8_component | 6.22us |
| rule_iter_8_tags_1_term | 6.36us |
| rule_iter_8_tags_4_terms | 882.69ns |
| rule_iter_16_tags_1_term | 741.21us |
| rule_iter_16_tags_4_terms | 1.14ms |
| rule_iter_8_components_1_term | 6.57us |
| rule_iter_8_components_4_terms | 1.10us |
| rule_iter_16_components_1_term | 1.09ms |
| rule_iter_16_components_4_terms | 1.38ms |
| rule_inherit_depth_1_tables_1 | 6.23us |
| rule_inherit_depth_1_tables_1024 | 32.50us |
| rule_inherit_depth_2_tables_1 | 6.35us |
| rule_inherit_depth_2_tables_1024 | 32.27us |
| rule_inherit_depth_8_tables_1 | 6.75us |
| rule_inherit_depth_8_tables_1024 | 32.77us |
| rule_inherit_depth_16_tables_1 | 7.23us |
| rule_inherit_depth_16_tables_1024 | 33.55us |
| query_init_fini_1_ids | 684.90ns |
| query_init_fini_8_ids | 4.73us |
| query_init_fini_16_ids | 7.65us |
| query_iter_1_table_1_tag | 6.21us |
| query_iter_2_tables_1_tag | 6.31us |
| query_iter_4_tables_1_tag | 6.37us |
| query_iter_8_tables_1_tag | 6.61us |
| query_iter_16_tables_1_tag | 7.31us |
| query_iter_32_tables_1_tag | 6.82us |
| query_iter_64_tables_1_tag | 7.53us |
| query_iter_128_tables_1_tag | 8.32us |
| query_iter_256_tables_1_tag | 9.08us |
| query_iter_512_tables_1_tag | 10.83us |
| query_iter_1024_tables_1_tag | 14.63us |
| query_iter_4096_tables_1_tag | 31.87us |
| query_iter_4096_tables_4_tags | 31.86us |
| query_iter_4096_tables_4_comps | 81.64us |
| query_iter_4096_tables_8_tags | 31.81us |
| query_iter_4096_tables_8_comps | 81.50us |
| query_iter_65536_tables_4_tags | 774.98us |
| query_iter_65536_tables_4_comps | 2.70ms |
| query_iter_65536_tables_8_tags | 756.45us |
| query_iter_65536_tables_8_comps | 2.72ms |
| query_iter_255_empty_1_fill | 31.35ns |
| query_iter_1023_empty_1_fill | 31.14ns |
| query_iter_rnd_8_tags | 10.90us |
| query_iter_rnd_16_tags | 769.62us |
| query_count_1_table | 2.75ns |
| query_count_2_tables | 3.15ns |
| query_count_4_tables | 4.05ns |
| query_count_8_tables | 6.32ns |
| query_count_16_tables | 12.20ns |
| query_count_32_tables | 27.95ns |
| query_count_64_tables | 62.77ns |
| query_count_128_tables | 144.88ns |
| query_count_256_tables | 285.38ns |
| query_count_512_tables | 944.15ns |
| query_count_1024_tables | 2.93us |
| query_count_4096_tables | 12.76us |
| query_count_65536_tables | 421.66us |
| progress_0_systems | 159.36ns |
| progress_1_system | 229.69ns |
| progress_10_systems | 615.75ns |
| progress_100_systems | 4.33us |
| create_delete_table_1_id | 126.59ns |
| create_delete_table_10_ids | 215.11ns |
| create_delete_table_100_ids | 1.13us |
| create_delete_table_1000_ids | 15.05us |
| match_table_1_of_10_queries | 243.48ns |
| match_table_5_of_10_queries | 483.74ns |
| match_table_10_of_10_queries | 781.47ns |
| match_table_1_of_100_queries | 245.38ns |
| match_table_10_of_100_queries | 780.55ns |
| match_table_50_of_100_queries | 3.33us |
| match_table_100_of_100_queries | 7.49us |
| match_table_1_of_1000_queries | 243.50ns |
| match_table_10_of_1000_queries | 782.11ns |
| match_table_100_of_1000_queries | 7.47us |
| match_table_1000_of_1000_queries | 82.60us |
| rematch_1_of_1000_tables | 68.16us |
| rematch_10_of_1000_tables | 68.27us |
| rematch_100_of_1000_tables | 66.15us |
| rematch_1000_of_1000_tables | 46.73us |
| fill_empty_table_0_queries | 230.59ns |
| fill_empty_table_1_query | 292.54ns |
| fill_empty_table_10_queries | 513.14ns |
| fill_empty_table_100_queries | 3.49us |
| fill_empty_table_1000_queries | 41.91us |
| table_add_remove_1_id | 2.65ns |
| table_add_remove_4_ids | 3.00ns |
| table_add_remove_16_ids | 4.12ns |
| table_add_remove_32_ids | 4.56ns |
| table_add_remove_64_ids | 4.83ns |