{"id":13728163,"url":"https://github.com/abeimler/ecs_benchmark","last_synced_at":"2025-04-07T06:12:24.054Z","repository":{"id":37887231,"uuid":"72794321","full_name":"abeimler/ecs_benchmark","owner":"abeimler","description":"Benchmarks of common ECS (Entity-Component-System)-Frameworks in C++ (or C)","archived":false,"fork":false,"pushed_at":"2024-08-16T16:42:26.000Z","size":14792,"stargazers_count":246,"open_issues_count":2,"forks_count":14,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-31T04:08:18.739Z","etag":null,"topics":["benchmark","c-plus-plus","c-plus-plus-20","cmake","cpp","cpp20","ecs","ecs-framework","entity-component-system","entt","flecs","modern-cpp"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/abeimler.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-11-03T22:59:48.000Z","updated_at":"2025-03-02T14:56:32.000Z","dependencies_parsed_at":"2023-12-22T02:08:38.309Z","dependency_job_id":"33305621-2f15-467a-99de-a9c782db053f","html_url":"https://github.com/abeimler/ecs_benchmark","commit_stats":null,"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abeimler%2Fecs_benchmark","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abeimler%2Fecs_benchmark/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abeimler%2Fecs_benchmark/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abeimler%2Fecs_benchmark/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abeimler","download_url":"https://codeload.github.com/abeimler/ecs_benchmark/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247601449,"owners_count":20964864,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["benchmark","c-plus-plus","c-plus-plus-20","cmake","cpp","cpp20","ecs","ecs-framework","entity-component-system","entt","flecs","modern-cpp"],"created_at":"2024-08-03T02:00:38.054Z","updated_at":"2025-04-07T06:12:24.020Z","avatar_url":"https://github.com/abeimler.png","language":"C++","readme":"# Entity-Component-System Benchmarks\n\n[![Actions Status](https://github.com/abeimler/ecs_benchmark/workflows/ci/badge.svg)](https://github.com/abeimler/ecs_benchmark/actions)\n![License](https://img.shields.io/github/license/abeimler/ecs_benchmark)\n![Standard](https://img.shields.io/badge/c%2B%2B-20-blue)\n\nThis repository contains a collection of benchmarks for popular Entity-Component-System (ECS) frameworks.\nThe benchmarks cover different aspects of ECS frameworks, such as update systems, component additions/removals, and entity creation/destruction.\nIt's important to note that different ECS frameworks have different strengths and weaknesses.\nFor example, some frameworks might excel in adding/removing components, while others might be better at creating/destroying entities or have query support.\nTherefore, it's crucial to choose an ECS framework based on your specific requirements.\n\nECS (Entity-Component-System) Frameworks:\n\n* [EntityX](https://github.com/alecthomas/entityx)\n* [EnTT](https://github.com/skypjack/entt)\n* [Ginseng](https://github.com/apples/ginseng)\n* [mustache](https://github.com/kirillochnev/mustache)\n* [flecs](https://github.com/SanderMertens/flecs)\n* [pico_ecs](https://github.com/empyreanx/pico_headers)\n* [gaia-ecs](https://github.com/richardbiely/gaia-ecs)\n\n## TL;DR Results\n\nMain feature of an ECS is the iterating over a lot of entities and using system to update the components.\nThe results of these benchmarks should be used as a starting point for your own benchmarking efforts.\n\n### Update systems (for-each entities (with mixed components) in 7 systems)\n\n\n![ComplexSystemsUpdateMixedEntities Plot](img/ComplexSystemsUpdateMixedEntities.svg)\n\n_Graph shows cost per entity, tables shows total cost. lower is faster._\n\n|                                      | EnTT   | EnTT (runtime)   | EnTT (group)   | EnTT (stable)         | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   | gaia-ecs (SoA)   |\n|:-------------------------------------|:-------|:-----------------|:---------------|:----------------------|:----------|:-----------|:--------|:-----------|:-----------|:-----------------|\n| Update     1 entities with 7 Systems | 123ns  | 130ns            | 89ns           | 131ns                 | 48ns      | 221ns      | 1741ns  | 67ns       | 227ns      | 225ns            |\n| Update     4 entities with 7 Systems | 223ns  | 364ns            | 138ns          | 169ns                 | 106ns     | 475ns      | 2727ns  | 125ns      | 416ns      | 394ns            |\n| Update     8 entities with 7 Systems | 310ns  | 684ns            | 203ns          | 237ns                 | 173ns     | 534ns      | 2868ns  | 209ns      | 454ns      | 454ns            |\n| Update    16 entities with 7 Systems | 348ns  | 838ns            | 207ns          | 182ns                 | 205ns     | 425ns      | 2663ns  | 209ns      | 355ns      | 332ns            |\n| Update    32 entities with 7 Systems | 574ns  | 1622ns           | 304ns          | 237ns                 | 368ns     | 520ns      | 2810ns  | 370ns      | 419ns      | 443ns            |\n| Update    64 entities with 7 Systems | 1038ns | 3052ns           | 501ns          | 353ns                 | 728ns     | 661ns      | 2960ns  | 652ns      | 560ns      | 558ns            |\n\n|                                      | EnTT   | EnTT (runtime)   | EnTT (group)   | EnTT (stable)         | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   | gaia-ecs (SoA)   |\n|:-------------------------------------|:-------|:-----------------|:---------------|:----------------------|:----------|:-----------|:--------|:-----------|:-----------|:-----------------|\n| Update   256 entities with 7 Systems | 7us    | 21us             | 4us            | 4us                   | 4us       | 2us        | 4us     | 5us        | 2us        | 2us              |\n| Update   ~1K entities with 7 Systems | 31us   | 91us             | 18us           | 21us                  | 16us      | 7us        | 10us    | 19us       | 9us        | 10us             |\n| Update   ~4K entities with 7 Systems | 138us  | 374us            | 89us           | 103us                 | 68us      | 27us       | 30us    | 91us       | 45us       | 45us             |\n| Update  ~16K entities with 7 Systems | 569us  | 1455us           | 403us          | 365us                 | 321us     | 113us      | 120us   | 366us      | 219us      | 211us            |\n\n|                                      | EnTT   | EnTT (runtime)   | EnTT (group)   | EnTT (stable)         | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   | gaia-ecs (SoA)   |\n|:-------------------------------------|:-------|:-----------------|:---------------|:----------------------|:----------|:-----------|:--------|:-----------|:-----------|:-----------------|\n| Update  ~65K entities with 7 Systems | 2ms    | 5ms              | 1ms            | 1ms                   | 1ms       | 0ms        | 0ms     | 1ms        | 1ms        | 1ms              |\n| Update  262K entities with 7 Systems | 12ms   | 24ms             | 8ms            | 6ms                   | 6ms       | 3ms        | 3ms     | 6ms        | 7ms        | 7ms              |\n| Update   ~1M entities with 7 Systems | 40ms   | 102ms            | 35ms           | 26ms                  | 27ms      | 16ms       | 19ms    | 25ms       | 31ms       | 32ms             |\n| Update   ~2M entities with 7 Systems | 85ms   | 184ms            | 87ms           | 51ms                  | 55ms      | 33ms       | 42ms    | 53ms       | 62ms       | 69ms             |\n\n\n\nWhile this benchmark only includes up to 6 components and 7 small systems,\nit's important to note that Entity-Component-Systems can become much more complex in the wild,\nwith hundreds of components and systems.\nTherefore, it's crucial to always benchmark your specific cases and systems when necessary and compare results.\nChoose an ECS framework based on its features,\nfor example, EnTT offers [resource management](https://github.com/skypjack/entt/wiki/Crash-Course:-resource-management) and [event handling](https://github.com/skypjack/entt/wiki/Crash-Course:-events,-signals-and-everything-in-between),\nwhile flecs provides useful [add-ons](https://github.com/SanderMertens/flecs#addons) and [querying](https://github.com/SanderMertens/flecs/tree/master/examples/cpp/queries/basics),\nand EntityX includes a built-in [world/system manager](https://github.com/alecthomas/entityx#manager-tying-it-all-together=).\n\nTo evaluate a framework, look at the examples and API design, and pick the one that suits your needs.\n\n\n## Details\n\n### Features\n\nAll benchmarks are located in the [`benchmark/benchmarks/`](benchmark/benchmarks/) directory and write with with the [google/benchmark](https://github.com/google/benchmark) library.\nEach benchmark uses an example application for each framework (see [`src/`](src) directory), and every example application has specific base features implemented (see [`src/base`](src/base)).\n\n#### Components\n\n1. `PositionComponent`: includes `x` and `y` coordinates.\n2. `VelocityComponent`: includes `x` and `y` coordinates for movement.\n3. `DataComponent`: includes some arbitrary data.\n4. `HealthComponent`: Hero/Monster data includes HP/MaxHP and status.\n5. `DamageComponent`: Hero/Monster data includes damage.\n6. `SpriteComponent`: Hero/Monster ASCII character as sprite.\n\n#### Systems\n\n1. `MovementSystem`: updates the `PositionComponent` with a constant `VelocityComponent`.\n2. `DataSystem`: updates the `DataComponent` with arbitrary data.\n3. `MoreComplexSystem`: updates components with random data and arbitrary information.\n4. `HealthSystem`: update Hero/Monster health (update HP and status).\n5. `DamageSystem`: update Hero/Monster health by taking damage.\n6. `SpriteSystem`: update Hero/Monster ASCII character depending on health and type.\n7. `RenderSystem`: \"render\"(write) Hero/Monster character sprite into a \"frame buffer\"(string buffer).\n\n\n\n## Additional Benchmarks\n\nBenchmarks for more common features, such as \"Creating entities\", \"Adding and removing components\", and others.\n\n### Features tested\n\n* Entity Creation\n* Entity Destruction\n* Component Retrieval\n* Adding and removing components\n* Iterating entities/quires\n\n\n### Environment\n\n* **OS:** Linux 64-Bit (Kernel: 6.10.4)\n* **CPU:** 3.13GHz @ 12Cores\n* **RAM:** 47GB\n* **Compiler:** gcc (GCC) 14.2.1\n\n\n---\n\n### Create entities\n\n\n![CreateEntities Plot](img/CreateEntities.svg)\n\n_Graph shows cost per entity, tables shows total cost. lower is faster._\n\n|                                           | EntityX   | EnTT   | Ginseng   | mustache   | Flecs    | pico_ecs   | gaia-ecs   |\n|:------------------------------------------|:----------|:-------|:----------|:-----------|:---------|:-----------|:-----------|\n| Create     1 entities with two Components | 1368ns    | 2881ns | 10449ns   | 2327ns     | 439949ns | 1331ns     | 4683ns     |\n| Create     4 entities with two Components | 1816ns    | 3155ns | 10119ns   | 2692ns     | 444861ns | 1315ns     | 4901ns     |\n| Create     8 entities with two Components | 2245ns    | 3461ns | 10313ns   | 3086ns     | 444572ns | 1426ns     | 5522ns     |\n| Create    16 entities with two Components | 2995ns    | 3812ns | 10869ns   | 3654ns     | 443523ns | 1555ns     | 6458ns     |\n| Create    32 entities with two Components | 4233ns    | 4419ns | 11265ns   | 4838ns     | 448326ns | 1875ns     | 8323ns     |\n| Create    64 entities with two Components | 6848ns    | 5706ns | 12227ns   | 7042ns     | 467177ns | 2499ns     | 12369ns    |\n\n|                                           | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:------------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Create   256 entities with two Components | 21us      | 13us   | 16us      | 20us       | 535us   | 6us        | 36us       |\n| Create   ~1K entities with two Components | 81us      | 42us   | 34us      | 73us       | 846us   | 21us       | 125us      |\n| Create   ~4K entities with two Components | 318us     | 161us  | 101us     | 283us      | 1958us  | 92us       | 481us      |\n| Create  ~16K entities with two Components | 1319us    | 623us  | 363us     | 1109us     | 6365us  | 366us      | 1924us     |\n\n|                                           | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:------------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Create  ~65K entities with two Components | 4ms       | 2ms    | 1ms       | 4ms        | 22ms    | 1ms        | 8ms        |\n| Create  262K entities with two Components | 20ms      | 10ms   | 8ms       | 18ms       | 109ms   | 6ms        | 36ms       |\n| Create   ~1M entities with two Components | 97ms      | 68ms   | 52ms      | 90ms       | 409ms   | 48ms       | 151ms      |\n| Create   ~2M entities with two Components | 191ms     | 133ms  | 109ms     | 175ms      | 741ms   | 77ms       | 325ms      |\n\n\n\n### Destroy entities\n\n\n![DestroyEntities Plot](img/DestroyEntities.svg)\n\n_Graph shows cost per entity, tables shows total cost. lower is faster._\n\n|                                            | EntityX   | EnTT   | Ginseng   | Flecs    | pico_ecs   | gaia-ecs   |\n|:-------------------------------------------|:----------|:-------|:----------|:---------|:-----------|:-----------|\n| Destroy     1 entities with two components | 1008ns    | 904ns  | 1056ns    | 364035ns | 1208ns     | 3074ns     |\n| Destroy     4 entities with two components | 1236ns    | 1028ns | 1419ns    | 363733ns | 1241ns     | 3355ns     |\n| Destroy     8 entities with two components | 1366ns    | 1196ns | 1975ns    | 381173ns | 1267ns     | 3751ns     |\n| Destroy    16 entities with two components | 1660ns    | 1502ns | 2793ns    | 371021ns | 1320ns     | 4752ns     |\n| Destroy    32 entities with two components | 2394ns    | 2139ns | 4419ns    | 377250ns | 1438ns     | 6833ns     |\n| Destroy    64 entities with two components | 3815ns    | 3372ns | 7731ns    | 376331ns | 1644ns     | 10905ns    |\n\n|                                            | EntityX   | EnTT   | Ginseng   | Flecs   | pico_ecs   | gaia-ecs   |\n|:-------------------------------------------|:----------|:-------|:----------|:--------|:-----------|:-----------|\n| Destroy   256 entities with two components | 12us      | 11us   | 28us      | 383us   | 2us        | 32us       |\n| Destroy   ~1K entities with two components | 48us      | 40us   | 105us     | 415us   | 8us        | 121us      |\n| Destroy   ~4K entities with two components | 201us     | 157us  | 434us     | 590us   | 32us       | 487us      |\n| Destroy  ~16K entities with two components | 812us     | 627us  | 1743us    | 1243us  | 122us      | 2038us     |\n\n|                                            | EntityX   | EnTT   | Ginseng   | Flecs   | pico_ecs   | gaia-ecs   |\n|:-------------------------------------------|:----------|:-------|:----------|:--------|:-----------|:-----------|\n| Destroy  ~65K entities with two components | 3ms       | 2ms    | 6ms       | 3ms     | 0ms        | 7ms        |\n| Destroy  262K entities with two components | 14ms      | 10ms   | 27ms      | 17ms    | 2ms        | 35ms       |\n| Destroy   ~1M entities with two components | 63ms      | 43ms   | 115ms     | 60ms    | 11ms       | 178ms      |\n| Destroy   ~2M entities with two components | 124ms     | 86ms   | 227ms     | 118ms   | 19ms       | 398ms      |\n\n\n\n### Get one component from entity\n\n\n![UnpackOneComponent Plot](img/UnpackOneComponent.svg)\n\n_Graph shows cost per entity, tables shows total cost. lower is faster._\n\n|                                        | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:---------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Unpack one component in     1 entities | 3ns       | 3ns    | 1ns       | 13ns       | 13ns    | 1ns        | 2ns        |\n| Unpack one component in     4 entities | 14ns      | 12ns   | 7ns       | 47ns       | 57ns    | 5ns        | 10ns       |\n| Unpack one component in     8 entities | 28ns      | 25ns   | 13ns      | 84ns       | 112ns   | 11ns       | 20ns       |\n| Unpack one component in    16 entities | 57ns      | 51ns   | 28ns      | 174ns      | 212ns   | 27ns       | 40ns       |\n| Unpack one component in    32 entities | 115ns     | 107ns  | 59ns      | 376ns      | 415ns   | 49ns       | 84ns       |\n| Unpack one component in    64 entities | 231ns     | 204ns  | 118ns     | 655ns      | 856ns   | 90ns       | 164ns      |\n\n|                                        | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:---------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Unpack one component in   256 entities | 0us       | 0us    | 0us       | 2us        | 3us     | 0us        | 0us        |\n| Unpack one component in   ~1K entities | 3us       | 3us    | 1us       | 10us       | 12us    | 1us        | 2us        |\n| Unpack one component in   ~4K entities | 14us      | 12us   | 7us       | 44us       | 51us    | 5us        | 10us       |\n| Unpack one component in  ~16K entities | 59us      | 51us   | 28us      | 203us      | 210us   | 21us       | 42us       |\n\n|                                        | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:---------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Unpack one component in  ~65K entities | 0ms       | 0ms    | 0ms       | 0ms        | 0ms     | 0ms        | 0ms        |\n| Unpack one component in  262K entities | 1ms       | 0ms    | 0ms       | 2ms        | 3ms     | 0ms        | 0ms        |\n| Unpack one component in   ~1M entities | 4ms       | 3ms    | 2ms       | 11ms       | 13ms    | 1ms        | 3ms        |\n| Unpack one component in   ~2M entities | 9ms       | 7ms    | 4ms       | 23ms       | 26ms    | 2ms        | 8ms        |\n\n\n**Note:**\n* Get one non-const component\n   1. `PositionComponent`\n\n\n### Get two components from entity\n\n\n![UnpackTwoComponents Plot](img/UnpackTwoComponents.svg)\n\n_Graph shows cost per entity, tables shows total cost. lower is faster._\n\n|                                         | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:----------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Unpack two components in     1 entities | 7ns       | 6ns    | 3ns       | 23ns       | 28ns    | 2ns        | 4ns        |\n| Unpack two components in     4 entities | 28ns      | 25ns   | 14ns      | 98ns       | 110ns   | 11ns       | 16ns       |\n| Unpack two components in     8 entities | 57ns      | 55ns   | 28ns      | 190ns      | 210ns   | 21ns       | 37ns       |\n| Unpack two components in    16 entities | 115ns     | 104ns  | 56ns      | 364ns      | 409ns   | 48ns       | 72ns       |\n| Unpack two components in    32 entities | 231ns     | 212ns  | 118ns     | 730ns      | 803ns   | 89ns       | 135ns      |\n| Unpack two components in    64 entities | 462ns     | 468ns  | 236ns     | 1554ns     | 1599ns  | 171ns      | 267ns      |\n\n|                                         | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:----------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Unpack two components in   256 entities | 1us       | 1us    | 0us       | 5us        | 6us     | 0us        | 1us        |\n| Unpack two components in   ~1K entities | 7us       | 6us    | 3us       | 22us       | 25us    | 2us        | 4us        |\n| Unpack two components in   ~4K entities | 29us      | 26us   | 14us      | 88us       | 103us   | 10us       | 16us       |\n| Unpack two components in  ~16K entities | 118us     | 105us  | 56us      | 368us      | 458us   | 42us       | 68us       |\n\n|                                         | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:----------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Unpack two components in  ~65K entities | 0ms       | 0ms    | 0ms       | 1ms        | 1ms     | 0ms        | 0ms        |\n| Unpack two components in  262K entities | 2ms       | 1ms    | 0ms       | 6ms        | 6ms     | 0ms        | 1ms        |\n| Unpack two components in   ~1M entities | 9ms       | 7ms    | 3ms       | 24ms       | 26ms    | 2ms        | 5ms        |\n| Unpack two components in   ~2M entities | 18ms      | 14ms   | 7ms       | 50ms       | 53ms    | 5ms        | 10ms       |\n\n\n\n**Note:**\n* Get non-const- and const-component\n   1. `PositionComponent`\n   2. `const VelocityComponent`\n\n\n### Get three components from entity\n\n\n![UnpackThreeComponents Plot](img/UnpackThreeComponents.svg)\n\n_Graph shows cost per entity, tables shows total cost. lower is faster._\n\n|                                           | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:------------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Unpack three components in     1 entities | 7ns       | 12ns   | 6ns       | 23ns       | 59ns    | 3ns        | 9ns        |\n| Unpack three components in     2 entities | 14ns      | 24ns   | 12ns      | 44ns       | 125ns   | 7ns        | 17ns       |\n| Unpack three components in     8 entities | 57ns      | 100ns  | 48ns      | 193ns      | 449ns   | 35ns       | 75ns       |\n| Unpack three components in    16 entities | 115ns     | 196ns  | 97ns      | 384ns      | 888ns   | 69ns       | 142ns      |\n| Unpack three components in    32 entities | 231ns     | 431ns  | 195ns     | 767ns      | 1781ns  | 121ns      | 276ns      |\n| Unpack three components in    64 entities | 470ns     | 795ns  | 396ns     | 1504ns     | 3588ns  | 237ns      | 546ns      |\n| Unpack three components in   128 entities | 927ns     | 1557ns | 841ns     | 2826ns     | 7121ns  | 468ns      | 1084ns     |\n\n|                                           | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:------------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Unpack three components in   512 entities | 3us       | 6us    | 3us       | 11us       | 30us    | 1us        | 4us        |\n| Unpack three components in   ~2K entities | 14us      | 25us   | 12us      | 44us       | 112us   | 7us        | 17us       |\n| Unpack three components in   ~8K entities | 59us      | 100us  | 50us      | 180us      | 449us   | 29us       | 72us       |\n\n|                                           | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:------------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Unpack three components in  ~32K entities | 0ms       | 0ms    | 0ms       | 0ms        | 1ms     | 0ms        | 0ms        |\n| Unpack three components in  131K entities | 1ms       | 1ms    | 0ms       | 2ms        | 7ms     | 0ms        | 1ms        |\n| Unpack three components in  524K entities | 4ms       | 6ms    | 3ms       | 12ms       | 28ms    | 1ms        | 5ms        |\n| Unpack three components in   ~1M entities | 9ms       | 14ms   | 7ms       | 25ms       | 57ms    | 3ms        | 11ms       |\n\n\n\n**Note:**\n* Not every entity has three components, some has only two\n* Get two non-const- and const-component(s)\n   1. `PositionComponent`\n   2. `const VelocityComponent`\n   3. `DataComponent` (optional)\n\n\n### Remove and add component\n\n\n![RemoveAddComponent Plot](img/RemoveAddComponent.svg)\n\n_Graph shows cost per entity, tables shows total cost. lower is faster._\n\n|                                              | EntityX   | EnTT   | Ginseng   | Flecs   | pico_ecs   | gaia-ecs   |\n|:---------------------------------------------|:----------|:-------|:----------|:--------|:-----------|:-----------|\n| Remove and Add a Component in     1 entities | 15ns      | 24ns   | 11ns      | 246ns   | 8ns        | 130ns      |\n| Remove and Add a Component in     4 entities | 59ns      | 109ns  | 43ns      | 957ns   | 42ns       | 535ns      |\n| Remove and Add a Component in     8 entities | 125ns     | 204ns  | 93ns      | 1901ns  | 69ns       | 1057ns     |\n| Remove and Add a Component in    16 entities | 244ns     | 396ns  | 181ns     | 3751ns  | 132ns      | 2108ns     |\n| Remove and Add a Component in    32 entities | 500ns     | 785ns  | 353ns     | 7450ns  | 256ns      | 4192ns     |\n| Remove and Add a Component in    64 entities | 951ns     | 1560ns | 703ns     | 14853ns | 505ns      | 8379ns     |\n\n|                                              | EntityX   | EnTT   | Ginseng   | Flecs   | pico_ecs   | gaia-ecs   |\n|:---------------------------------------------|:----------|:-------|:----------|:--------|:-----------|:-----------|\n| Remove and Add a Component in   256 entities | 3us       | 6us    | 2us       | 59us    | 2us        | 33us       |\n| Remove and Add a Component in   ~1K entities | 15us      | 25us   | 11us      | 236us   | 8us        | 134us      |\n| Remove and Add a Component in   ~4K entities | 60us      | 104us  | 48us      | 1004us  | 32us       | 536us      |\n| Remove and Add a Component in  ~16K entities | 249us     | 408us  | 185us     | 3890us  | 129us      | 2144us     |\n\n|                                              | EntityX   | EnTT   | Ginseng   | Flecs   | pico_ecs   | gaia-ecs   |\n|:---------------------------------------------|:----------|:-------|:----------|:--------|:-----------|:-----------|\n| Remove and Add a Component in  ~65K entities | 0ms       | 1ms    | 0ms       | 15ms    | 0ms        | 8ms        |\n| Remove and Add a Component in  262K entities | 4ms       | 6ms    | 3ms       | 62ms    | 2ms        | 34ms       |\n| Remove and Add a Component in   ~1M entities | 16ms      | 26ms   | 12ms      | 250ms   | 8ms        | 137ms      |\n| Remove and Add a Component in   ~2M entities | 32ms      | 53ms   | 23ms      | 527ms   | 16ms       | 277ms      |\n\n\n\n**Note:**\n* Remove and add `PositionComponent`\n\n\n\n### Update systems (for-each entities in 2 systems)\n\n\n  Cost per entity                         |  Cost of all entities\n:-------------------------------------------:|:------------------------------------------------------:\n  ![SystemsUpdate Plot](img/SystemsUpdate.svg)  |  ![SystemsUpdate Line Plot](img/LineSystemsUpdate.svg)  \n\n\n_Tables shows total cost. lower is faster._\n\n|                                      | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:-------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Update     1 entities with 2 systems | 39ns      | 27ns   | 13ns      | 68ns       | 1287ns  | 22ns       | 100ns      |\n| Update     4 entities with 2 systems | 93ns      | 55ns   | 34ns      | 90ns       | 1262ns  | 41ns       | 91ns       |\n| Update     8 entities with 2 systems | 166ns     | 99ns   | 59ns      | 94ns       | 1279ns  | 71ns       | 107ns      |\n| Update    16 entities with 2 systems | 314ns     | 161ns  | 109ns     | 122ns      | 1309ns  | 147ns      | 133ns      |\n| Update    32 entities with 2 systems | 601ns     | 294ns  | 218ns     | 173ns      | 1358ns  | 257ns      | 188ns      |\n| Update    64 entities with 2 systems | 1171ns    | 630ns  | 429ns     | 284ns      | 1467ns  | 490ns      | 289ns      |\n\n|                                      | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:-------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Update   256 entities with 2 systems | 5us       | 2us    | 1us       | 0us        | 2us     | 1us        | 0us        |\n| Update   ~1K entities with 2 systems | 18us      | 8us    | 6us       | 3us        | 4us     | 7us        | 3us        |\n| Update   ~4K entities with 2 systems | 82us      | 34us   | 29us      | 13us       | 14us    | 30us       | 15us       |\n| Update  ~16K entities with 2 systems | 315us     | 140us  | 127us     | 56us       | 56us    | 165us      | 65us       |\n\n|                                      | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:-------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Update  ~65K entities with 2 systems | 1ms       | 0ms    | 0ms       | 0ms        | 0ms     | 0ms        | 0ms        |\n| Update  262K entities with 2 systems | 5ms       | 2ms    | 2ms       | 1ms        | 3ms     | 2ms        | 3ms        |\n| Update   ~1M entities with 2 systems | 21ms      | 12ms   | 10ms      | 8ms        | 12ms    | 12ms       | 12ms       |\n| Update   ~2M entities with 2 systems | 44ms      | 25ms   | 21ms      | 15ms       | 25ms    | 22ms       | 25ms       |\n\n\n\n**Note:**\n* Systems used\n    1. `MovementSystem`\n    2. `DataSystem`\n\n\n### Update systems (for-each entities (with mixed components) in 2 systems)\n\n\n  Cost per entity                         |  Cost of all entities\n:-------------------------------------------:|:------------------------------------------------------:\n  ![SystemsUpdateMixedEntities Plot](img/SystemsUpdateMixedEntities.svg)  |  ![SystemsUpdateMixedEntities Line Plot](img/LineSystemsUpdateMixedEntities.svg)  \n\n\n_Tables shows total cost. lower is faster._\n\n|                                      | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:-------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Update     1 entities with 2 systems | 29ns      | 16ns   | 7ns       | 36ns       | 577ns   | 16ns       | 53ns       |\n| Update     4 entities with 2 systems | 75ns      | 45ns   | 28ns      | 126ns      | 1313ns  | 34ns       | 113ns      |\n| Update     8 entities with 2 systems | 137ns     | 87ns   | 51ns      | 151ns      | 1475ns  | 55ns       | 133ns      |\n| Update    16 entities with 2 systems | 266ns     | 145ns  | 94ns      | 190ns      | 1389ns  | 95ns       | 147ns      |\n| Update    32 entities with 2 systems | 534ns     | 278ns  | 198ns     | 242ns      | 1467ns  | 194ns      | 191ns      |\n| Update    64 entities with 2 systems | 1080ns    | 555ns  | 404ns     | 357ns      | 1583ns  | 353ns      | 300ns      |\n\n|                                      | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:-------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Update   256 entities with 2 systems | 4us       | 2us    | 1us       | 1us        | 2us     | 1us        | 1us        |\n| Update   ~1K entities with 2 systems | 18us      | 8us    | 7us       | 3us        | 4us     | 7us        | 4us        |\n| Update   ~4K entities with 2 systems | 82us      | 32us   | 28us      | 14us       | 15us    | 41us       | 15us       |\n| Update  ~16K entities with 2 systems | 301us     | 145us  | 132us     | 56us       | 56us    | 165us      | 67us       |\n\n|                                      | EntityX   | EnTT   | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   |\n|:-------------------------------------|:----------|:-------|:----------|:-----------|:--------|:-----------|:-----------|\n| Update  ~65K entities with 2 systems | 1ms       | 0ms    | 0ms       | 0ms        | 0ms     | 0ms        | 0ms        |\n| Update  262K entities with 2 systems | 5ms       | 3ms    | 2ms       | 1ms        | 2ms     | 2ms        | 3ms        |\n| Update   ~1M entities with 2 systems | 22ms      | 13ms   | 11ms      | 7ms        | 13ms    | 11ms       | 13ms       |\n| Update   ~2M entities with 2 systems | 44ms      | 30ms   | 22ms      | 15ms       | 25ms    | 24ms       | 25ms       |\n\n\n**Note:**\n* Systems used\n    1. `MovementSystem`\n    2. `DataSystem`\n* Not every entity has all three components, some got removed\n\n\n### Update systems (for-each entities in 7 systems)\n\n\n  Cost per entity                         |  Cost of all entities\n:-------------------------------------------:|:------------------------------------------------------:\n  ![ComplexSystemsUpdate Plot](img/ComplexSystemsUpdate.svg)  |  ![ComplexSystemsUpdate Line Plot](img/LineComplexSystemsUpdate.svg)  \n\n\n_Tables shows total cost. lower is faster._\n\n|                                      | EnTT   | EnTT (runtime)   | EnTT (group)   | EnTT (stable)         | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   | gaia-ecs (SoA)   |\n|:-------------------------------------|:-------|:-----------------|:---------------|:----------------------|:----------|:-----------|:--------|:-----------|:-----------|:-----------------|\n| Update     1 entities with 7 systems | 138ns  | 174ns            | 93ns           | 121ns                 | 51ns      | 224ns      | 2775ns  | 70ns       | 279ns      | 275ns            |\n| Update     4 entities with 7 systems | 293ns  | 525ns            | 174ns          | 239ns                 | 117ns     | 274ns      | 2584ns  | 157ns      | 335ns      | 316ns            |\n| Update     8 entities with 7 systems | 479ns  | 1016ns           | 272ns          | 351ns                 | 229ns     | 357ns      | 2626ns  | 288ns      | 384ns      | 384ns            |\n| Update    16 entities with 7 systems | 755ns  | 1963ns           | 415ns          | 560ns                 | 399ns     | 394ns      | 2630ns  | 516ns      | 490ns      | 498ns            |\n| Update    32 entities with 7 systems | 1357ns | 3664ns           | 775ns          | 1050ns                | 750ns     | 540ns      | 2777ns  | 947ns      | 627ns      | 611ns            |\n| Update    64 entities with 7 systems | 2620ns | 7461ns           | 1346ns         | 2214ns                | 1431ns    | 860ns      | 3079ns  | 1808ns     | 974ns      | 932ns            |\n\n|                                      | EnTT   | EnTT (runtime)   | EnTT (group)   | EnTT (stable)         | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   | gaia-ecs (SoA)   |\n|:-------------------------------------|:-------|:-----------------|:---------------|:----------------------|:----------|:-----------|:--------|:-----------|:-----------|:-----------------|\n| Update   256 entities with 7 systems | 10us   | 28us             | 5us            | 9us                   | 5us       | 2us        | 4us     | 6us        | 3us        | 3us              |\n| Update   ~1K entities with 7 systems | 52us   | 100us            | 27us           | 39us                  | 23us      | 8us        | 11us    | 27us       | 14us       | 14us             |\n| Update   ~4K entities with 7 systems | 202us  | 493us            | 132us          | 172us                 | 102us     | 37us       | 39us    | 106us      | 72us       | 73us             |\n| Update  ~16K entities with 7 systems | 827us  | 1947us           | 592us          | 651us                 | 445us     | 158us      | 189us   | 469us      | 362us      | 347us            |\n\n|                                      | EnTT   | EnTT (runtime)   | EnTT (group)   | EnTT (stable)         | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   | gaia-ecs (SoA)   |\n|:-------------------------------------|:-------|:-----------------|:---------------|:----------------------|:----------|:-----------|:--------|:-----------|:-----------|:-----------------|\n| Update  ~65K entities with 7 systems | 3ms    | 7ms              | 2ms            | 2ms                   | 1ms       | 0ms        | 0ms     | 1ms        | 1ms        | 1ms              |\n| Update  262K entities with 7 systems | 16ms   | 32ms             | 12ms           | 11ms                  | 8ms       | 4ms        | 6ms     | 7ms        | 10ms       | 12ms             |\n| Update   ~1M entities with 7 systems | 57ms   | 122ms            | 51ms           | 45ms                  | 35ms      | 21ms       | 25ms    | 31ms       | 43ms       | 43ms             |\n| Update   ~2M entities with 7 systems | 112ms  | 237ms            | 127ms          | 89ms                  | 70ms      | 42ms       | 52ms    | 65ms       | 84ms       | 85ms             |\n\n\n\n**Note:**\n* Systems used\n    1. `MovementSystem`\n    2. `DataSystem`\n    3. `MoreComplexSystem`\n    4. `HealthSystem`\n    5. `DamageSystem`\n    6. `SpriteSystem`\n    7. `RenderSystem`\n* \\*   EnTT iterate components via [views](https://github.com/skypjack/entt/wiki/Crash-Course:-entity-component-system#views=)\n* \\**  EnTT iterate components via [runtime views](https://github.com/skypjack/entt/wiki/Crash-Course:-entity-component-system#runtime-views=)\n* \\*** EnTT iterate components via [groups](https://github.com/skypjack/entt/wiki/Crash-Course:-entity-component-system#groups=):\n   1. `DataSystem`: No Group, use `registry.view\u003cDataComponent\u003e`. _(Can't group a single component)_\n   2. `MovementSystem`: Partial-owning group, `registry.group\u003cPositionComponent\u003e(entt::get\u003cconst VelocityComponent\u003e)`\n   3. `MoreComplexSystem`: Full-owning group, `registry.group\u003cPositionComponent, VelocityComponent, DataComponent\u003e()`\n* \\**** EnTT iterate components via view and uses a [stable component](https://github.com/skypjack/entt/wiki/Crash-Course:-entity-component-system#pointer-stability=) (`StablePositionComponent`)\n* \\***** gaia-ecs (SoA) iterate via [SoA Layout](https://github.com/richardbiely/gaia-ecs?tab=readme-ov-file#data-layouts) using an `Position`- and `Velocity`-SoA-component\n\n\n\n### Update systems (for-each entities (with mixed components) in 7 systems)\n\n\n  Cost per entity                         |  Cost of all entities\n:-------------------------------------------:|:------------------------------------------------------:\n  ![ComplexSystemsUpdateMixedEntities Plot](img/ComplexSystemsUpdateMixedEntities.svg)  |  ![ComplexSystemsUpdateMixedEntities Line Plot](img/LineComplexSystemsUpdateMixedEntities.svg)  \n\n\n_Tables shows total cost. lower is faster._\n\n|                                      | EnTT   | EnTT (runtime)   | EnTT (group)   | EnTT (stable)         | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   | gaia-ecs (SoA)   |\n|:-------------------------------------|:-------|:-----------------|:---------------|:----------------------|:----------|:-----------|:--------|:-----------|:-----------|:-----------------|\n| Update     1 entities with 7 Systems | 123ns  | 130ns            | 89ns           | 131ns                 | 48ns      | 221ns      | 1741ns  | 67ns       | 227ns      | 225ns            |\n| Update     4 entities with 7 Systems | 223ns  | 364ns            | 138ns          | 169ns                 | 106ns     | 475ns      | 2727ns  | 125ns      | 416ns      | 394ns            |\n| Update     8 entities with 7 Systems | 310ns  | 684ns            | 203ns          | 237ns                 | 173ns     | 534ns      | 2868ns  | 209ns      | 454ns      | 454ns            |\n| Update    16 entities with 7 Systems | 348ns  | 838ns            | 207ns          | 182ns                 | 205ns     | 425ns      | 2663ns  | 209ns      | 355ns      | 332ns            |\n| Update    32 entities with 7 Systems | 574ns  | 1622ns           | 304ns          | 237ns                 | 368ns     | 520ns      | 2810ns  | 370ns      | 419ns      | 443ns            |\n| Update    64 entities with 7 Systems | 1038ns | 3052ns           | 501ns          | 353ns                 | 728ns     | 661ns      | 2960ns  | 652ns      | 560ns      | 558ns            |\n\n|                                      | EnTT   | EnTT (runtime)   | EnTT (group)   | EnTT (stable)         | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   | gaia-ecs (SoA)   |\n|:-------------------------------------|:-------|:-----------------|:---------------|:----------------------|:----------|:-----------|:--------|:-----------|:-----------|:-----------------|\n| Update   256 entities with 7 Systems | 7us    | 21us             | 4us            | 4us                   | 4us       | 2us        | 4us     | 5us        | 2us        | 2us              |\n| Update   ~1K entities with 7 Systems | 31us   | 91us             | 18us           | 21us                  | 16us      | 7us        | 10us    | 19us       | 9us        | 10us             |\n| Update   ~4K entities with 7 Systems | 138us  | 374us            | 89us           | 103us                 | 68us      | 27us       | 30us    | 91us       | 45us       | 45us             |\n| Update  ~16K entities with 7 Systems | 569us  | 1455us           | 403us          | 365us                 | 321us     | 113us      | 120us   | 366us      | 219us      | 211us            |\n\n|                                      | EnTT   | EnTT (runtime)   | EnTT (group)   | EnTT (stable)         | Ginseng   | mustache   | Flecs   | pico_ecs   | gaia-ecs   | gaia-ecs (SoA)   |\n|:-------------------------------------|:-------|:-----------------|:---------------|:----------------------|:----------|:-----------|:--------|:-----------|:-----------|:-----------------|\n| Update  ~65K entities with 7 Systems | 2ms    | 5ms              | 1ms            | 1ms                   | 1ms       | 0ms        | 0ms     | 1ms        | 1ms        | 1ms              |\n| Update  262K entities with 7 Systems | 12ms   | 24ms             | 8ms            | 6ms                   | 6ms       | 3ms        | 3ms     | 6ms        | 7ms        | 7ms              |\n| Update   ~1M entities with 7 Systems | 40ms   | 102ms            | 35ms           | 26ms                  | 27ms      | 16ms       | 19ms    | 25ms       | 31ms       | 32ms             |\n| Update   ~2M entities with 7 Systems | 85ms   | 184ms            | 87ms           | 51ms                  | 55ms      | 33ms       | 42ms    | 53ms       | 62ms       | 69ms             |\n\n\n\n**Note:**\n* Systems used\n    1. `MovementSystem`\n    2. `DataSystem`\n    3. `MoreComplexSystem`\n    4. `HealthSystem`\n    5. `DamageSystem`\n    6. `SpriteSystem`\n    7. `RenderSystem`\n* Not every entity has all three components, some got removed\n* \\*   EnTT iterate components via [views](https://github.com/skypjack/entt/wiki/Crash-Course:-entity-component-system#views=)\n* \\**  EnTT iterate components via [runtime views](https://github.com/skypjack/entt/wiki/Crash-Course:-entity-component-system#runtime-views=)\n* \\*** EnTT iterate components via [groups](https://github.com/skypjack/entt/wiki/Crash-Course:-entity-component-system#groups=):\n    1. `DataSystem`: No Group, use `registry.view\u003cDataComponent\u003e`. _(Can't group a single component)_\n    2. `MovementSystem`: Partial-owning group, `registry.group\u003cPositionComponent\u003e(entt::get\u003cconst VelocityComponent\u003e)`\n    3. `MoreComplexSystem`: Full-owning group, `registry.group\u003cPositionComponent, VelocityComponent, DataComponent\u003e()`\n* \\**** EnTT iterate components via view and uses a [stable component](https://github.com/skypjack/entt/wiki/Crash-Course:-entity-component-system#pointer-stability=) (`StablePositionComponent`)\n* \\***** gaia-ecs (SoA) iterate via [SoA Layout](https://github.com/richardbiely/gaia-ecs?tab=readme-ov-file#data-layouts) using an `Position`- und `Velocity`-SoA-component\n\n\n## Contributing\n\nIf you have any improvements to the ECS-examples for any of the frameworks,\nfeel free to make a pull request or open an issue.\nThe example(s) for each framework can be found in [`src/`](src/), and benchmarks are located in [`benchmarks/benchmarks/`](benchmarks/benchmarks/) for more details.\n\nAdditionally, you can write tests for the framework example and add some metadata to the [plot.config.json](plot.config.json) file.\nAny contributions are greatly appreciated!\n\n_TODO: make more detailed \"how to add framework\"_\n\nRead [CONTRIBUTING.md](CONTRIBUTING) for more details.\n\n## Run Benchmarks\n\n### Using [Taskfile](https://taskfile.dev/installation/)\n\n0. Install [Taskfile](https://taskfile.dev/installation/)\n1. Run Build: `task build`\n2. Run (All) Benchmarks: `task benchmark`\n3. Plot Graphs: `task plot:all`\n\nOr run `task generate`\n\nYou can now find the benchmark-results in [`reports/`](reports/).\n\n_You need python (\u003e=3.8.0) and some [dependencies](scripts/gen-benchmark-report/requirements.txt) to run [gen-benchmark-report](scripts/gen-benchmark-report) (plotting), install [pipx](https://pipx.pypa.io/stable/installation/) and [poetry](https://python-poetry.org/docs/#installing-with-pipx)._\n\nThen install the dependencies for the script:\n```bash\ncd ./scripts/gen-benchmark-report \u0026\u0026 poetry install\n```\n\nOr run the script directly:\n```bash\ntask plot:all\n```\n\n#### Generate README\n\n```bash\ntask generate:readme\n```\n\n\n### ~~Step-by-Step~~\n\n1. Configure and build benchmarks, see [Building Details](doc/README_building.md):\n   1. `cmake -S . -B ./build`\n   2. `cmake --build ./build`\n2. Run benchmark(s), with [`run-benchmarks.sh`](run-benchmarks.sh) or each:\n   * `./build/benchmark/benchmarks/entt/ecs-benchmark-entt` _(console output)_ _(optional)_\n   * `./build/benchmark/benchmarks/entt/ecs-benchmark-entt --benchmark_format=json \u003e ./reports/entt.json` _(write json report)_\n3. Plot Reports, after generating json reports, see [`plot-results.sh`](plot-results.sh):\n   1. `pipx run --spec ./scripts/gen-benchmark-report gen-benchmark-report -i ./info.json gen-plot ./reports/entityx.json ./reports/entt.json ./reports/ginseng.json ./reports/mustache.json ./reports/openecs.json ./reports/flecs.json` _(generate graphs)_\n   2. `pipx run --spec ./scripts/gen-benchmark-report gen-benchmark-report -i ./info.json gen-results-md ./reports/entityx.json ./reports/entt.json ./reports/ginseng.json ./reports/mustache.json ./reports/openecs.json ./reports/flecs.json` _(generate full report)_\n\n\n### Run a single benchmark\n\n```bash\ncmake -G Ninja -S . -B build\ncmake --build build --target ecs-benchmark-entt -j 4\n./build/benchmark/benchmarks/entt/ecs-benchmark-entt\n```\n\nYou can use `-DCMAKE_BUILD_TYPE=Debug` to enable Sanitizers.\n\n\n## Links and More\n\n- [Dependency Setup](doc/README_dependencies.md)\n- [Building Details](doc/README_building.md)\n- Project Template, mix of: [starter_template](https://github.com/cpp-best-practices/gui_starter_template) and [ModernCppStarter](https://github.com/TheLartians/ModernCppStarter)\n  - [Forked cpp_vcpkg_project](https://github.com/abeimler/cpp_vcpkg_project)\n- [Google benchmark](https://github.com/google/benchmark)\n- https://github.com/SanderMertens/ecs-faq\n- https://github.com/jslee02/awesome-entity-component-system\n\n\n### Candidates\n\n#### EntityX by @alecthomas \n\n\u003e Entity Component Systems (ECS) are a form of decomposition that completely decouples entity logic and data from the entity \"objects\" themselves. The Evolve your Hierarchy article provides a solid overview of EC systems and why you should use them.\n\nVersion: 1.1.2 (Apr 2023)\n\n#### EnTT by @skypjack \n\n\u003e EnTT is a header-only, tiny and easy to use library for game programming and much more written in modern C++.\n\nVersion: v3.13.2\n\n#### Ginseng by @apples \n\n\u003e Ginseng is an entity-component-system (ECS) library designed for use in games.\n\u003e \n\u003e The main advantage over similar libraries is that the component types do not need to be listed or registered. Component types are detected dynamically.\n\u003e \n\u003e Any function-like object can be used as a system. The function's parameters are used to determine the required components.\n\nVersion: 1.1 (Dec 2021)\n\n#### mustache by @kirillochnev \n\n\u003e A fast, modern C++ Entity Component System\n\nVersion: 0.2 (Feb 2024)\n\n#### OpenEcs by @Gronis \n\n\u003e Open Ecs is an Entity Component System that uses metaprogramming, cache coherency, and other useful tricks to maximize performance and configurability. It is written in c++11 without further dependencies.\n\nVersion: 0.1.101 (Apr 2017)\n\n#### Flecs by @SanderMertens \n\n\u003e Flecs is a fast and lightweight Entity Component System that lets you build games and simulations with millions of entities.\n\nVersion: v4.0.1\n\n#### pico_ecs by @empyreanx \n\n\u003e A collection of cross-platform single header libraries written in C. Pure and simple ECS.\n\nVersion: 2.3 (Sep 2023)\n\n#### gaia-ecs by @richardbiely \n\n\u003e Gaia-ECS is a fast and easy-to-use ECS framework.\n\nVersion: v0.8.6\n\n","funding_links":[],"categories":["ECS Libraries","C++","[Other Resources](#contents)"],"sub_categories":["[Benchmarks](#contents)"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabeimler%2Fecs_benchmark","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabeimler%2Fecs_benchmark","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabeimler%2Fecs_benchmark/lists"}