diff --git a/Source/MQTTnet.Benchmarks/BaseBenchmark.cs b/Source/MQTTnet.Benchmarks/BaseBenchmark.cs index a33ad7a1..a3a50ce9 100644 --- a/Source/MQTTnet.Benchmarks/BaseBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/BaseBenchmark.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + namespace MQTTnet.Benchmarks { public abstract class BaseBenchmark diff --git a/Source/MQTTnet.Benchmarks/ChannelAdapterBenchmark.cs b/Source/MQTTnet.Benchmarks/ChannelAdapterBenchmark.cs index f73e7b36..be2e0eb4 100644 --- a/Source/MQTTnet.Benchmarks/ChannelAdapterBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/ChannelAdapterBenchmark.cs @@ -2,54 +2,25 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using BenchmarkDotNet.Attributes; -using MQTTnet.Adapter; -using MQTTnet.Internal; -using MQTTnet.Packets; using System; using System.IO; using System.Threading; +using BenchmarkDotNet.Attributes; +using MQTTnet.Adapter; using MQTTnet.Diagnostics; using MQTTnet.Formatter; +using MQTTnet.Packets; using MQTTnet.Tests.Mockups; namespace MQTTnet.Benchmarks { [MemoryDiagnoser] - public sealed class ChannelAdapterBenchmark + public sealed class ChannelAdapterBenchmark : BaseBenchmark { MqttChannelAdapter _channelAdapter; int _iterations; - MemoryStream _stream; MqttPublishPacket _packet; - - [GlobalSetup] - public void Setup() - { - _packet = new MqttPublishPacket - { - Topic = "A" - }; - - var serializer = new MqttPacketFormatterAdapter(MqttProtocolVersion.V311, new MqttBufferWriter(4096, 65535)); - - var serializedPacket = Join(serializer.Encode(_packet).Join()); - - _iterations = 10000; - - _stream = new MemoryStream(_iterations * serializedPacket.Length); - - for (var i = 0; i < _iterations; i++) - { - _stream.Write(serializedPacket, 0, serializedPacket.Length); - } - - _stream.Position = 0; - - var channel = new MemoryMqttChannel(_stream); - - _channelAdapter = new MqttChannelAdapter(channel, serializer, null, new MqttNetEventLogger()); - } + MemoryStream _stream; [Benchmark] public void Receive_10000_Messages() @@ -77,6 +48,34 @@ namespace MQTTnet.Benchmarks _stream.Position = 0; } + [GlobalSetup] + public void Setup() + { + _packet = new MqttPublishPacket + { + Topic = "A" + }; + + var serializer = new MqttPacketFormatterAdapter(MqttProtocolVersion.V311, new MqttBufferWriter(4096, 65535)); + + var serializedPacket = Join(serializer.Encode(_packet).Join()); + + _iterations = 10000; + + _stream = new MemoryStream(_iterations * serializedPacket.Length); + + for (var i = 0; i < _iterations; i++) + { + _stream.Write(serializedPacket, 0, serializedPacket.Length); + } + + _stream.Position = 0; + + var channel = new MemoryMqttChannel(_stream); + + _channelAdapter = new MqttChannelAdapter(channel, serializer, null, new MqttNetEventLogger()); + } + static byte[] Join(params ArraySegment[] chunks) { var buffer = new MemoryStream(); @@ -88,4 +87,4 @@ namespace MQTTnet.Benchmarks return buffer.ToArray(); } } -} +} \ No newline at end of file diff --git a/Source/MQTTnet.Benchmarks/Configurations/AllowNonOptimized.cs b/Source/MQTTnet.Benchmarks/Configurations/AllowNonOptimized.cs deleted file mode 100644 index 2ae1e19b..00000000 --- a/Source/MQTTnet.Benchmarks/Configurations/AllowNonOptimized.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using BenchmarkDotNet.Jobs; -using BenchmarkDotNet.Validators; - -namespace MQTTnet.Benchmarks.Configurations -{ - /// - /// this options may be used to run benchmarks in debugmode and attach a performance profiler - /// https://benchmarkdotnet.org/Configs/Configs.htm - /// - public class AllowNonOptimized : BaseConfig - { - public AllowNonOptimized() - { - AddValidator(JitOptimizationsValidator.DontFailOnError); // ALLOW NON-OPTIMIZED DLLS - AddJob(Job.InProcess); - } - } -} \ No newline at end of file diff --git a/Source/MQTTnet.Benchmarks/Configurations/BaseConfig.cs b/Source/MQTTnet.Benchmarks/Configurations/BaseConfig.cs deleted file mode 100644 index 15324a6a..00000000 --- a/Source/MQTTnet.Benchmarks/Configurations/BaseConfig.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using BenchmarkDotNet.Configs; -using System.Linq; - -namespace MQTTnet.Benchmarks.Configurations -{ - public class BaseConfig : ManualConfig - { - public BaseConfig() - { - AddLogger(DefaultConfig.Instance.GetLoggers().ToArray()); // manual config has no loggers by default - AddExporter(DefaultConfig.Instance.GetExporters().ToArray()); // manual config has no exporters by default - AddColumnProvider(DefaultConfig.Instance.GetColumnProviders().ToArray()); // manual config has no columns by default - } - } -} diff --git a/Source/MQTTnet.Benchmarks/Configurations/RuntimeCompareConfig.cs b/Source/MQTTnet.Benchmarks/Configurations/RuntimeCompareConfig.cs deleted file mode 100644 index cd01b723..00000000 --- a/Source/MQTTnet.Benchmarks/Configurations/RuntimeCompareConfig.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using BenchmarkDotNet.Environments; -using BenchmarkDotNet.Jobs; -using BenchmarkDotNet.Toolchains.CsProj; - -namespace MQTTnet.Benchmarks.Configurations -{ - public class RuntimeCompareConfig : BaseConfig - { - public RuntimeCompareConfig() - { - AddJob(Job.Default.WithRuntime(ClrRuntime.Net48)); - AddJob(Job.Default.WithRuntime(CoreRuntime.Core50).WithToolchain(CsProjCoreToolchain.NetCoreApp50)); - } - } -} diff --git a/Source/MQTTnet.Benchmarks/LoggerBenchmark.cs b/Source/MQTTnet.Benchmarks/LoggerBenchmark.cs index 0c325e04..70f0ff51 100644 --- a/Source/MQTTnet.Benchmarks/LoggerBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/LoggerBenchmark.cs @@ -11,7 +11,7 @@ namespace MQTTnet.Benchmarks [SimpleJob(RuntimeMoniker.Net60)] [RPlotExporter] [MemoryDiagnoser] - public class LoggerBenchmark + public class LoggerBenchmark : BaseBenchmark { MqttNetNullLogger _nullLogger; MqttNetSourceLogger _sourceNullLogger; diff --git a/Source/MQTTnet.Benchmarks/MQTTnet.Benchmarks.csproj b/Source/MQTTnet.Benchmarks/MQTTnet.Benchmarks.csproj index 63f0fbca..9cac34d0 100644 --- a/Source/MQTTnet.Benchmarks/MQTTnet.Benchmarks.csproj +++ b/Source/MQTTnet.Benchmarks/MQTTnet.Benchmarks.csproj @@ -3,7 +3,7 @@ Exe Full - net5.0;net6.0 + net6.0 7.2 false false diff --git a/Source/MQTTnet.Benchmarks/MessageDeliveryBenchmark.cs b/Source/MQTTnet.Benchmarks/MessageDeliveryBenchmark.cs index 5bbcfdb7..3738a23a 100644 --- a/Source/MQTTnet.Benchmarks/MessageDeliveryBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/MessageDeliveryBenchmark.cs @@ -1,5 +1,8 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using BenchmarkDotNet.Attributes; -using BenchmarkDotNet.Jobs; using MQTTnet.Client; using MQTTnet.Server; using System; @@ -8,14 +11,10 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; - namespace MQTTnet.Benchmarks { - /// - /// Create a number of topics, publish, subscribe, and wait for response - /// [MemoryDiagnoser] - public class MessageDeliveryBenchmark + public class MessageDeliveryBenchmark : BaseBenchmark { List _topicPublishMessages; diff --git a/Source/MQTTnet.Benchmarks/MessageProcessingBenchmark.cs b/Source/MQTTnet.Benchmarks/MessageProcessingBenchmark.cs index 98d60c07..c5387e76 100644 --- a/Source/MQTTnet.Benchmarks/MessageProcessingBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/MessageProcessingBenchmark.cs @@ -12,7 +12,7 @@ namespace MQTTnet.Benchmarks [SimpleJob(RuntimeMoniker.Net60)] [RPlotExporter, RankColumn] [MemoryDiagnoser] - public class MessageProcessingBenchmark + public class MessageProcessingBenchmark : BaseBenchmark { MqttServer _mqttServer; IMqttClient _mqttClient; diff --git a/Source/MQTTnet.Benchmarks/MessageProcessingMqttConnectionContextBenchmark.cs b/Source/MQTTnet.Benchmarks/MessageProcessingMqttConnectionContextBenchmark.cs index f66c5be8..fd812f46 100644 --- a/Source/MQTTnet.Benchmarks/MessageProcessingMqttConnectionContextBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/MessageProcessingMqttConnectionContextBenchmark.cs @@ -15,7 +15,7 @@ namespace MQTTnet.Benchmarks { [SimpleJob(RuntimeMoniker.Net60)] [MemoryDiagnoser] - public class MessageProcessingMqttConnectionContextBenchmark + public class MessageProcessingMqttConnectionContextBenchmark : BaseBenchmark { IWebHost _host; IMqttClient _mqttClient; diff --git a/Source/MQTTnet.Benchmarks/MqttPacketReaderWriterBenchmark.cs b/Source/MQTTnet.Benchmarks/MqttPacketReaderWriterBenchmark.cs index ffa01db1..a0c474a1 100644 --- a/Source/MQTTnet.Benchmarks/MqttPacketReaderWriterBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/MqttPacketReaderWriterBenchmark.cs @@ -1,7 +1,10 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using System; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Jobs; -using MQTTnet.AspNetCore; using MQTTnet.Formatter; using MQTTnet.Tests.Mockups; @@ -9,7 +12,7 @@ namespace MQTTnet.Benchmarks { [SimpleJob(RuntimeMoniker.Net60)] [MemoryDiagnoser] - public class MqttPacketReaderWriterBenchmark + public class MqttPacketReaderWriterBenchmark : BaseBenchmark { readonly byte[] _demoPayload = new byte[1024]; diff --git a/Source/MQTTnet.Benchmarks/MqttTcpChannelBenchmark.cs b/Source/MQTTnet.Benchmarks/MqttTcpChannelBenchmark.cs index 5c3a1d1f..787e951d 100644 --- a/Source/MQTTnet.Benchmarks/MqttTcpChannelBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/MqttTcpChannelBenchmark.cs @@ -17,7 +17,7 @@ namespace MQTTnet.Benchmarks { [SimpleJob(RuntimeMoniker.Net60)] [MemoryDiagnoser] - public sealed class MqttTcpChannelBenchmark + public class MqttTcpChannelBenchmark : BaseBenchmark { MqttServer _mqttServer; IMqttChannel _serverChannel; diff --git a/Source/MQTTnet.Benchmarks/Program.cs b/Source/MQTTnet.Benchmarks/Program.cs index 3cafa08d..be231ff8 100644 --- a/Source/MQTTnet.Benchmarks/Program.cs +++ b/Source/MQTTnet.Benchmarks/Program.cs @@ -3,89 +3,140 @@ // See the LICENSE file in the project root for more information. using System; +using System.Collections.Generic; +using System.Linq; +using BenchmarkDotNet.Loggers; using BenchmarkDotNet.Running; -using MQTTnet.Benchmarks.Configurations; using MQTTnet.Diagnostics; namespace MQTTnet.Benchmarks { public static class Program { - public static void Main(string[] args) - { - Console.WriteLine($"MQTTnet - Benchmarks ({TargetFrameworkProvider.TargetFramework})"); - Console.WriteLine("--------------------------------------------------------"); - Console.WriteLine("1 = MessageProcessingBenchmark"); - Console.WriteLine("2 = SerializerBenchmark"); - Console.WriteLine("3 = LoggerBenchmark"); - Console.WriteLine("4 = TopicFilterComparerBenchmark"); - Console.WriteLine("5 = ChannelAdapterBenchmark"); - Console.WriteLine("6 = MqttTcpChannelBenchmark"); - Console.WriteLine("7 = TcpPipesBenchmark"); - Console.WriteLine("8 = MessageProcessingMqttConnectionContextBenchmark"); - Console.WriteLine("9 = ServerProcessingBenchmark"); - Console.WriteLine("a = MqttPacketReaderWriterBenchmark"); - Console.WriteLine("b = RoundtripBenchmark"); - Console.WriteLine("c = SubscribeBenchmark"); - Console.WriteLine("d = UnsubscribeBenchmark"); - Console.WriteLine("e = MessageDeliveryBenchmark"); - Console.WriteLine("f = AsyncLockBenchmark"); - Console.WriteLine("g = MqttBufferReaderBenchmark"); + static int _selectedBenchmarkIndex; + static List _benchmarks; - var pressedKey = Console.ReadKey(true); - switch (pressedKey.KeyChar) + public static void Main(string[] arguments) + { + _benchmarks = CollectBenchmarks(); + HandleArguments(arguments); + + while (true) { - case '1': - BenchmarkRunner.Run(); - break; - case '2': - BenchmarkRunner.Run(); - break; - case '3': - BenchmarkRunner.Run(); - break; - case '4': - BenchmarkRunner.Run(); - break; - case '5': - BenchmarkRunner.Run(); - break; - case '6': - BenchmarkRunner.Run(); - break; - case '7': - BenchmarkRunner.Run(); - break; - case '8': - BenchmarkRunner.Run(new RuntimeCompareConfig()); - break; - case '9': - BenchmarkRunner.Run(); - break; - case 'a': - BenchmarkRunner.Run(typeof(MqttPacketReaderWriterBenchmark)); - break; - case 'b': - BenchmarkRunner.Run(); - break; - case 'c': - BenchmarkRunner.Run(); - break; - case 'd': - BenchmarkRunner.Run(); - break; - case 'e': - BenchmarkRunner.Run(); - break; - case 'f': - BenchmarkRunner.Run(); - break; - case 'g': - BenchmarkRunner.Run(); + RenderMenu(); + + var key = Console.ReadKey(true); + + if (key.Key == ConsoleKey.DownArrow) + { + _selectedBenchmarkIndex++; + if (_selectedBenchmarkIndex > _benchmarks.Count - 1) + { + _selectedBenchmarkIndex = 0; + } + } + else if (key.Key == ConsoleKey.UpArrow) + { + _selectedBenchmarkIndex--; + if (_selectedBenchmarkIndex < 0) + { + _selectedBenchmarkIndex = _benchmarks.Count - 1; + } + } + else if (key.Key == ConsoleKey.Escape) + { + Environment.Exit(0); + } + else if (key.Key == ConsoleKey.Enter) + { break; + } } + BenchmarkRunner.Run(_benchmarks[_selectedBenchmarkIndex]); + + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine("Press any key to exit"); Console.ReadLine(); } + + static List CollectBenchmarks() + { + var benchmarks = new List(); + + var types = typeof(Program).Assembly.GetExportedTypes(); + foreach (var type in types) + { + if (typeof(BaseBenchmark).IsAssignableFrom(type)) + { + if (type != typeof(BaseBenchmark)) + { + benchmarks.Add(type); + } + } + } + + return benchmarks.OrderBy(b => b.Name).ToList(); + } + + static void HandleArguments(string[] arguments) + { + if (arguments.Length == 0) + { + return; + } + + // Allow for preselection to avoid developer frustration. + + if (int.TryParse(arguments[0], out var benchmarkIndex)) + { + _selectedBenchmarkIndex = benchmarkIndex; + return; + } + + _selectedBenchmarkIndex = _benchmarks.FindIndex(b => b.Name.Equals(arguments[0])); + + if (_selectedBenchmarkIndex < 0) + { + _selectedBenchmarkIndex = 0; + } + + if (_selectedBenchmarkIndex > _benchmarks.Count - 1) + { + _selectedBenchmarkIndex = _benchmarks.Count - 1; + } + } + + static void RenderMenu() + { + Console.Clear(); + + Console.WriteLine($"MQTTnet - Benchmarks ({TargetFrameworkProvider.TargetFramework})"); + Console.WriteLine("-----------------------------------------------"); + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine("Press arrow keys for benchmark selection"); + Console.WriteLine("Press Enter for benchmark execution"); + Console.WriteLine("Press Esc for exit"); + Console.ForegroundColor = ConsoleColor.White; + Console.WriteLine(); + + for (var index = 0; index < _benchmarks.Count; index++) + { + var benchmark = _benchmarks[index]; + + if (_selectedBenchmarkIndex == index) + { + Console.Write("-> "); + } + else + { + Console.Write(" "); + } + + Console.WriteLine(benchmark.Name); + } + + Console.WriteLine(); + } } } \ No newline at end of file diff --git a/Source/MQTTnet.Benchmarks/RoundtripProcessingBenchmark.cs b/Source/MQTTnet.Benchmarks/RoundtripProcessingBenchmark.cs index 93ab9a29..e3358fb9 100644 --- a/Source/MQTTnet.Benchmarks/RoundtripProcessingBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/RoundtripProcessingBenchmark.cs @@ -8,7 +8,7 @@ namespace MQTTnet.Benchmarks [SimpleJob(RuntimeMoniker.Net60)] [RPlotExporter, RankColumn] [MemoryDiagnoser] - public class RoundtripProcessingBenchmark + public class RoundtripProcessingBenchmark : BaseBenchmark { [GlobalSetup] public void GlobalSetup() diff --git a/Source/MQTTnet.Benchmarks/ServerProcessingBenchmark.cs b/Source/MQTTnet.Benchmarks/ServerProcessingBenchmark.cs index e4824a89..fbac6dc0 100644 --- a/Source/MQTTnet.Benchmarks/ServerProcessingBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/ServerProcessingBenchmark.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Jobs; using MQTTnet.Tests.Mockups; @@ -8,7 +12,7 @@ namespace MQTTnet.Benchmarks [SimpleJob(RuntimeMoniker.Net60)] [RPlotExporter, RankColumn] [MemoryDiagnoser] - public class ServerProcessingBenchmark + public class ServerProcessingBenchmark : BaseBenchmark { [GlobalSetup] public void GlobalSetup() diff --git a/Source/MQTTnet.Benchmarks/SubscribeBenchmark.cs b/Source/MQTTnet.Benchmarks/SubscribeBenchmark.cs index 0449fe62..7825a941 100644 --- a/Source/MQTTnet.Benchmarks/SubscribeBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/SubscribeBenchmark.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Jobs; using MQTTnet.Client; @@ -8,7 +12,7 @@ using System.Linq; namespace MQTTnet.Benchmarks { [MemoryDiagnoser] - public class SubscribeBenchmark + public class SubscribeBenchmark : BaseBenchmark { MqttServer _mqttServer; IMqttClient _mqttClient; diff --git a/Source/MQTTnet.Benchmarks/TcpPipesBenchmark.cs b/Source/MQTTnet.Benchmarks/TcpPipesBenchmark.cs index 535e207f..cc84f379 100644 --- a/Source/MQTTnet.Benchmarks/TcpPipesBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/TcpPipesBenchmark.cs @@ -15,7 +15,7 @@ namespace MQTTnet.Benchmarks { [SimpleJob(RuntimeMoniker.Net60)] [MemoryDiagnoser] - public class TcpPipesBenchmark + public class TcpPipesBenchmark : BaseBenchmark { IDuplexPipe _client; IDuplexPipe _server; diff --git a/Source/MQTTnet.Benchmarks/TopicFilterComparerBenchmark.cs b/Source/MQTTnet.Benchmarks/TopicFilterComparerBenchmark.cs index 0e080e8c..a75d3521 100644 --- a/Source/MQTTnet.Benchmarks/TopicFilterComparerBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/TopicFilterComparerBenchmark.cs @@ -11,7 +11,7 @@ namespace MQTTnet.Benchmarks [SimpleJob(RuntimeMoniker.Net60)] [RPlotExporter] [MemoryDiagnoser] - public class TopicFilterComparerBenchmark + public class TopicFilterComparerBenchmark : BaseBenchmark { static readonly char[] TopicLevelSeparator = { '/' }; diff --git a/Source/MQTTnet.Benchmarks/TopicGenerator.cs b/Source/MQTTnet.Benchmarks/TopicGenerator.cs index cb17fee4..d4f9d8e7 100644 --- a/Source/MQTTnet.Benchmarks/TopicGenerator.cs +++ b/Source/MQTTnet.Benchmarks/TopicGenerator.cs @@ -1,31 +1,30 @@ using System; using System.Collections.Generic; -using System.Text; namespace MQTTnet.Benchmarks { public class TopicGenerator { public static void Generate( - int numPublishers, int numTopicsPerPublisher, - out Dictionary> topicsByPublisher, - out Dictionary> singleWildcardTopicsByPublisher, - out Dictionary> multiWildcardTopicsByPublisher - ) + int numPublishers, + int numTopicsPerPublisher, + out Dictionary> topicsByPublisher, + out Dictionary> singleWildcardTopicsByPublisher, + out Dictionary> multiWildcardTopicsByPublisher) { topicsByPublisher = new Dictionary>(); singleWildcardTopicsByPublisher = new Dictionary>(); multiWildcardTopicsByPublisher = new Dictionary>(); // Find some reasonable distribution across three topic levels - var topicsPerLevel = (int)Math.Pow(numTopicsPerPublisher, (1.0 / 3.0)); + var topicsPerLevel = (int)Math.Pow(numTopicsPerPublisher, 1.0 / 3.0); if (topicsPerLevel <= 0) { topicsPerLevel = 1; } - int numLevel1Topics = topicsPerLevel; - int numLevel2Topics = topicsPerLevel; + var numLevel1Topics = topicsPerLevel; + var numLevel2Topics = topicsPerLevel; var maxNumLevel3Topics = 1 + (int)((double)numTopicsPerPublisher / numLevel1Topics / numLevel2Topics); if (maxNumLevel3Topics <= 0) @@ -35,7 +34,7 @@ namespace MQTTnet.Benchmarks for (var p = 0; p < numPublishers; ++p) { - int publisherTopicCount = 0; + var publisherTopicCount = 0; var publisherName = "pub" + p; for (var l1 = 0; l1 < numLevel1Topics; ++l1) { @@ -44,19 +43,22 @@ namespace MQTTnet.Benchmarks for (var l3 = 0; l3 < maxNumLevel3Topics; ++l3) { if (publisherTopicCount >= numTopicsPerPublisher) + { break; + } - var topic = string.Format("{0}/building{1}/level{2}/sensor{3}", publisherName, l1 + 1, l2 + 1, l3 + 1); + var topic = $"{publisherName}/building{l1 + 1}/level{l2 + 1}/sensor{l3 + 1}"; AddPublisherTopic(publisherName, topic, topicsByPublisher); if (l2 == 0) { - var singleWildcardTopic = string.Format("{0}/building{1}/+/sensor{2}", publisherName, l1 + 1, l3 + 1); + var singleWildcardTopic = $"{publisherName}/building{l1 + 1}/+/sensor{l3 + 1}"; AddPublisherTopic(publisherName, singleWildcardTopic, singleWildcardTopicsByPublisher); } - if ((l1 == 0) && (l3 == 0)) + + if (l1 == 0 && l3 == 0) { - var multiWildcardTopic = string.Format("{0}/+/level{1}/+", publisherName, l2 + 1); + var multiWildcardTopic = $"{publisherName}/+/level{l2 + 1}/+"; AddPublisherTopic(publisherName, multiWildcardTopic, multiWildcardTopicsByPublisher); } @@ -75,7 +77,8 @@ namespace MQTTnet.Benchmarks topicList = new List(); topicsByPublisher.Add(publisherName, topicList); } + topicList.Add(topic); } } -} +} \ No newline at end of file diff --git a/Source/MQTTnet.Benchmarks/UnsubscribeBenchmark.cs b/Source/MQTTnet.Benchmarks/UnsubscribeBenchmark.cs index 6b4be7e1..e18a71df 100644 --- a/Source/MQTTnet.Benchmarks/UnsubscribeBenchmark.cs +++ b/Source/MQTTnet.Benchmarks/UnsubscribeBenchmark.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using BenchmarkDotNet.Attributes; using MQTTnet.Client; using MQTTnet.Server; @@ -7,7 +11,7 @@ using System.Linq; namespace MQTTnet.Benchmarks { [MemoryDiagnoser] - public class UnsubscribeBenchmark + public class UnsubscribeBenchmark : BaseBenchmark { MqttServer _mqttServer; IMqttClient _mqttClient; diff --git a/Source/MQTTnet.Benchmarks/packages.config b/Source/MQTTnet.Benchmarks/packages.config deleted file mode 100644 index bb930145..00000000 --- a/Source/MQTTnet.Benchmarks/packages.config +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file