using System.Collections.Generic; using BenchmarkDotNet.Attributes; using Moq; using Robust.Shared.Exceptions; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Reflection; namespace Content.Benchmarks { public class ComponentManagerGetAllComponents { private readonly List _entities = new(); private IComponentManager _componentManager; [Params(5000)] public int N { get; set; } public static void TestRun() { var x = new ComponentManagerGetAllComponents { N = 500 }; x.Setup(); x.Run(); } [GlobalSetup] public void Setup() { // Initialize component manager. IoCManager.InitThread(); IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); var entityManager = new Mock().Object; IoCManager.RegisterInstance(entityManager); IoCManager.RegisterInstance(new Mock().Object); var dummyReg = new Mock(); dummyReg.SetupGet(p => p.Name).Returns("Dummy"); dummyReg.SetupGet(p => p.Type).Returns(typeof(DummyComponent)); dummyReg.SetupGet(p => p.NetID).Returns((uint?) null); dummyReg.SetupGet(p => p.NetworkSynchronizeExistence).Returns(false); dummyReg.SetupGet(p => p.References).Returns(new [] {typeof(DummyComponent)}); var componentFactory = new Mock(); componentFactory.Setup(p => p.GetComponent()).Returns(new DummyComponent()); componentFactory.Setup(p => p.GetRegistration(It.IsAny())).Returns(dummyReg.Object); componentFactory.Setup(p => p.GetAllRefTypes()).Returns(new[] {typeof(DummyComponent)}); IoCManager.RegisterInstance(componentFactory.Object); IoCManager.BuildGraph(); _componentManager = IoCManager.Resolve(); _componentManager.Initialize(); // Initialize N entities with one component. for (var i = 0; i < N; i++) { var entity = new Entity(entityManager, new EntityUid(i + 1)); _entities.Add(entity); _componentManager.AddComponent(entity); } } [Benchmark] public int Run() { var count = 0; foreach (var _ in _componentManager.EntityQuery(true)) { count += 1; } return count; } [Benchmark] public int Noop() { var count = 0; _componentManager.TryGetComponent(default, out DummyComponent _); return count; } private class DummyComponent : Component { public override string Name => "Dummy"; } } }