diff --git a/Benchmarks/AdaECSBenchmarks/AdaECSBenchmarks.swift b/Benchmarks/AdaECSBenchmarks/AdaECSBenchmarks.swift new file mode 100644 index 000000000..be8927b40 --- /dev/null +++ b/Benchmarks/AdaECSBenchmarks/AdaECSBenchmarks.swift @@ -0,0 +1,242 @@ +import AdaECS +import Benchmark + +// MARK: - Components + +@Component +private struct Position { + var x: Float + var y: Float +} + +@Component +private struct Velocity { + var x: Float + var y: Float +} + +@Component +private struct CompA { + var value: Float +} + +@Component +private struct CompB { + var value: Float +} + +@Component +private struct CompC { + var value: Float +} + +@Component +private struct FragData { + var value: Float +} + +@Component +private struct Matrix4x4 { + var m00: Float, m01: Float, m02: Float, m03: Float + var m10: Float, m11: Float, m12: Float, m13: Float + var m20: Float, m21: Float, m22: Float, m23: Float + var m30: Float, m31: Float, m32: Float, m33: Float +} + +// MARK: - Constants + +private enum BenchConstants { + static let spawnEntities = 100_000 + static let simpleIterEntities = 100_000 + static let fragmentedEntitiesPerType = 33_334 + static let heavyComputeEntities = 1_000 + static let heavyComputeIterations = 100 + static let addRemoveEntities = 100_000 +} + +// MARK: - Setup Helpers + +private func makeSimpleIterWorld(entityCount: Int) -> (World, Query, Velocity>) { + let world = World() + for i in 0.., Velocity>() + query.update(from: world) + + return (world, query) +} + +private func makeFragmentedIterWorld(entitiesPerType: Int) -> (World, Query>) { + let world = World() + + for i in 0..>() + query.update(from: world) + + return (world, query) +} + +private func makeHeavyComputeWorld(entityCount: Int) -> (World, Query>) { + let world = World() + for _ in 0..>() + query.update(from: world) + + return (world, query) +} + +private func makeAddRemoveWorld(entityCount: Int) -> (World, [Entity.ID]) { + let world = World() + var ids: [Entity.ID] = [] + ids.reserveCapacity(entityCount) + + for i in 0.. Void = { + Benchmark("AdaECS.Spawn") { benchmark in + // #region agent log + DebugBenchmarkLog.benchmarkPhase(name: "Spawn", phase: "start") + // #endregion + for _ in benchmark.scaledIterations { + let world = World() + for _ in 0..