DeviceNetworkingBenchmark.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using System.Collections.Generic;
  2. using System.Threading.Tasks;
  3. using BenchmarkDotNet.Attributes;
  4. using Content.IntegrationTests;
  5. using Content.IntegrationTests.Pair;
  6. using Content.IntegrationTests.Tests.DeviceNetwork;
  7. using Content.Server.DeviceNetwork.Systems;
  8. using Content.Shared.DeviceNetwork;
  9. using Robust.Shared;
  10. using Robust.Shared.Analyzers;
  11. using Robust.Shared.GameObjects;
  12. using Robust.Shared.Map;
  13. namespace Content.Benchmarks;
  14. [Virtual]
  15. [MemoryDiagnoser]
  16. public class DeviceNetworkingBenchmark
  17. {
  18. private TestPair _pair = default!;
  19. private DeviceNetworkTestSystem _deviceNetTestSystem = default!;
  20. private DeviceNetworkSystem _deviceNetworkSystem = default!;
  21. private EntityUid _sourceEntity;
  22. private EntityUid _sourceWirelessEntity;
  23. private readonly List<EntityUid> _targetEntities = new();
  24. private readonly List<EntityUid> _targetWirelessEntities = new();
  25. private NetworkPayload _payload = default!;
  26. [TestPrototypes]
  27. private const string Prototypes = @"
  28. - type: entity
  29. name: DummyNetworkDevicePrivate
  30. id: DummyNetworkDevicePrivate
  31. components:
  32. - type: DeviceNetwork
  33. transmitFrequency: 100
  34. receiveFrequency: 100
  35. deviceNetId: Private
  36. - type: entity
  37. name: DummyWirelessNetworkDevice
  38. id: DummyWirelessNetworkDevice
  39. components:
  40. - type: DeviceNetwork
  41. transmitFrequency: 100
  42. receiveFrequency: 100
  43. deviceNetId: Wireless
  44. - type: WirelessNetworkConnection
  45. range: 100
  46. ";
  47. //public static IEnumerable<int> EntityCountSource { get; set; }
  48. //[ParamsSource(nameof(EntityCountSource))]
  49. public int EntityCount = 500;
  50. [GlobalSetup]
  51. public async Task SetupAsync()
  52. {
  53. ProgramShared.PathOffset = "../../../../";
  54. PoolManager.Startup(typeof(DeviceNetworkingBenchmark).Assembly);
  55. _pair = await PoolManager.GetServerClient();
  56. var server = _pair.Server;
  57. await server.WaitPost(() =>
  58. {
  59. var entityManager = server.InstanceDependencyCollection.Resolve<IEntityManager>();
  60. _deviceNetworkSystem = entityManager.EntitySysManager.GetEntitySystem<DeviceNetworkSystem>();
  61. _deviceNetTestSystem = entityManager.EntitySysManager.GetEntitySystem<DeviceNetworkTestSystem>();
  62. var testValue = "test";
  63. _payload = new NetworkPayload
  64. {
  65. ["Test"] = testValue,
  66. ["testnumber"] = 1,
  67. ["testbool"] = true
  68. };
  69. _sourceEntity = entityManager.SpawnEntity("DummyNetworkDevicePrivate", MapCoordinates.Nullspace);
  70. _sourceWirelessEntity = entityManager.SpawnEntity("DummyWirelessNetworkDevice", MapCoordinates.Nullspace);
  71. for (var i = 0; i < EntityCount; i++)
  72. {
  73. _targetEntities.Add(entityManager.SpawnEntity("DummyNetworkDevicePrivate", MapCoordinates.Nullspace));
  74. _targetWirelessEntities.Add(entityManager.SpawnEntity("DummyWirelessNetworkDevice", MapCoordinates.Nullspace));
  75. }
  76. });
  77. }
  78. [GlobalCleanup]
  79. public async Task Cleanup()
  80. {
  81. await _pair.DisposeAsync();
  82. PoolManager.Shutdown();
  83. }
  84. [Benchmark(Baseline = true, Description = "Entity Events")]
  85. public async Task EventSentBaseline()
  86. {
  87. var server = _pair.Server;
  88. _pair.Server.Post(() =>
  89. {
  90. foreach (var entity in _targetEntities)
  91. {
  92. _deviceNetTestSystem.SendBaselineTestEvent(entity);
  93. }
  94. });
  95. await server.WaitRunTicks(1);
  96. await server.WaitIdleAsync();
  97. }
  98. [Benchmark(Description = "Device Net Broadcast No Connection Checks")]
  99. public async Task DeviceNetworkBroadcastNoConnectionChecks()
  100. {
  101. var server = _pair.Server;
  102. _pair.Server.Post(() =>
  103. {
  104. _deviceNetworkSystem.QueuePacket(_sourceEntity, null, _payload, 100);
  105. });
  106. await server.WaitRunTicks(1);
  107. await server.WaitIdleAsync();
  108. }
  109. [Benchmark(Description = "Device Net Broadcast Wireless Connection Checks")]
  110. public async Task DeviceNetworkBroadcastWirelessConnectionChecks()
  111. {
  112. var server = _pair.Server;
  113. _pair.Server.Post(() =>
  114. {
  115. _deviceNetworkSystem.QueuePacket(_sourceWirelessEntity, null, _payload, 100);
  116. });
  117. await server.WaitRunTicks(1);
  118. await server.WaitIdleAsync();
  119. }
  120. }