Benchmarks
This chapter gives an overview of the runtime cost of typical Ark operations.
All time information is per entity.
All components used in the benchmarks have two int64 fields.
Batch operations are performed in batches of 1000 entities.
Benchmark code: benchmark/table in the GitHub repository.
Benchmarks are run automatically in the GitHub CI, and are updated on this page on every merge into the main branch.
They always reflect the latest development state of Ark.
For comparative benchmarks of different Go ECS implementations, see the go-ecs-benchmarks repository.
Last run: Sun, 02 Nov 2025 20:12:03 UTC
Version: Ark v0.6.4
Go version: 1.25.1
CPU: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
Query
| Operation |
Time |
Remark |
| Query.Next |
2.2 ns |
|
| Query.Next + Query.Get 1 |
2.3 ns |
|
| Query.Next + Query.Get 2 |
2.1 ns |
|
| Query.Next + Query.Get 5 |
2.4 ns |
|
| Query.Next + Query.Entity |
2.0 ns |
|
| Query.Next + Query.Relation |
2.1 ns |
|
| Filter1.Query + Query1.Close |
51.1 ns |
|
| Filter1.Query + Query1.Close |
52.1 ns |
registered filter |
World access
| Operation |
Time |
Remark |
| World.Alive |
0.8 ns |
random, 1000 entities |
| Map.Get |
2.4 ns |
random, 1000 entities |
| Map.GetUnchecked |
1.8 ns |
random, 1000 entities |
| Map.Has |
2.1 ns |
random, 1000 entities |
| Map.HasUnchecked |
1.5 ns |
random, 1000 entities |
| Map5.Get 5 |
7.5 ns |
random, 1000 entities |
| Map5.HasAll 5 |
6.1 ns |
random, 1000 entities |
| Map.GetRelation |
2.4 ns |
random, 1000 entities |
| Map.GetRelationUnchecked |
1.9 ns |
random, 1000 entities |
Entities
| Operation |
Time |
Remark |
| Entity.IsZero |
0.3 ns |
|
| World.NewEntity |
14.7 ns |
memory already alloc. |
| Map1.NewEntityFn w/ 1 Comp |
29.2 ns |
memory already alloc. |
| Map5.NewEntityFn w/ 5 Comps |
45.1 ns |
memory already alloc. |
| Map1.NewEntity w/ 1 Comp |
36.1 ns |
memory already alloc. |
| Map5.NewEntity w/ 5 Comps |
60.0 ns |
memory already alloc. |
| World.RemoveEntity |
26.0 ns |
|
| World.RemoveEntity w/ 1 Comp |
33.3 ns |
|
| World.RemoveEntity w/ 5 Comps |
57.0 ns |
|
Entities, batched
| Operation |
Time |
Remark |
| World.NewEntities |
10.5 ns |
1000, memory already alloc. |
| Map1.NewBatchFn w/ 1 Comp |
10.6 ns |
1000, memory already alloc. |
| Map5.NewBatchFn w/ 5 Comps |
10.6 ns |
1000, memory already alloc. |
| World.RemoveEntities |
4.3 ns |
1000 |
| World.RemoveEntities w/ 1 Comp |
4.4 ns |
1000 |
| World.RemoveEntities w/ 5 Comps |
5.5 ns |
1000 |
Components
| Operation |
Time |
Remark |
| Map1.AddFn 1 Comp |
37.2 ns |
memory already alloc. |
| Map5.AddFn 5 Comps |
49.0 ns |
memory already alloc. |
| Map1.AddFn 1 to 5 Comps |
99.6 ns |
memory already alloc. |
| Map1.Add 1 Comp |
43.4 ns |
memory already alloc. |
| Map5.Add 5 Comps |
64.5 ns |
memory already alloc. |
| Map1.Add 1 to 5 Comps |
105.7 ns |
memory already alloc. |
| Map1.Remove 1 Comp |
42.2 ns |
memory already alloc. |
| Map5.Remove 5 Comps |
83.7 ns |
memory already alloc. |
| Map1.Remove 1 of 5 Comps |
90.5 ns |
memory already alloc. |
| Exchange1.ExchangeFn 1 Comp |
52.6 ns |
memory already alloc. |
| Exchange1.ExchangeFn 1 of 5 Comps |
108.3 ns |
memory already alloc. |
| Exchange1.Exchange 1 Comp |
61.5 ns |
memory already alloc. |
| Exchange1.Exchange 1 of 5 Comps |
112.5 ns |
memory already alloc. |
Components, batched
| Operation |
Time |
Remark |
| Map1.AddBatchFn 1 Comp |
3.2 ns |
1000, memory already alloc. |
| Map5.AddBatchFn 5 Comps |
3.2 ns |
1000, memory already alloc. |
| Map1.AddBatchFn 1 to 5 Comps |
6.5 ns |
1000, memory already alloc. |
| Map1.RemoveBatch 1 Comp |
3.5 ns |
1000, memory already alloc. |
| Map5.RemoveBatch 5 Comps |
4.6 ns |
1000, memory already alloc. |
| Map1.RemoveBatch 1 of 5 Comps |
6.0 ns |
1000, memory already alloc. |
| Exchange1.ExchangeBatchFn 1 Comp |
3.6 ns |
1000, memory already alloc. |
| Exchange1.ExchangeBatchFn 1 of 5 Comps |
6.3 ns |
1000, memory already alloc. |
Other
| Operation |
Time |
Remark |
| ecs.NewWorld |
18.4 μs |
|
| World.Reset |
37.9 ns |
empty world |
| ecs.ComponentID |
17.7 ns |
component already registered |