TurboMqtt icon indicating copy to clipboard operation
TurboMqtt copied to clipboard

Mqtt311Decoder: use ImmutableList.Builder

Open Aaronontheweb opened this issue 1 year ago • 1 comments
trafficstars

Fewer object allocations during packet parsing this way

Aaronontheweb avatar Aug 30 '24 21:08 Aaronontheweb

dev


BenchmarkDotNet v0.14.0, Windows 11 (10.0.22631.4037/23H2/2023Update/SunValley3)
12th Gen Intel Core i7-1260P, 1 CPU, 16 logical and 12 physical cores
.NET SDK 8.0.302
  [Host]     : .NET 8.0.6 (8.0.624.26715), X64 RyuJIT AVX2
  Job-GKHTFW : .NET 8.0.6 (8.0.624.26715), X64 RyuJIT AVX2

InvocationCount=1  LaunchCount=10  RunStrategy=Monitoring  
UnrollFactor=1  WarmupCount=10  

Method QoSLevel PayloadSizeBytes ProtocolVersion Mean Error StdDev Median Req/sec
PublishAndReceiveMessages AtMostOnce 10 V3_1_1 3.519 μs 0.7376 μs 2.175 μs 2.758 μs 284,182.50
PublishAndReceiveMessages AtMostOnce 1024 V3_1_1 3.811 μs 0.6556 μs 1.933 μs 3.095 μs 262,409.13
PublishAndReceiveMessages AtMostOnce 2048 V3_1_1 4.430 μs 0.6173 μs 1.820 μs 3.831 μs 225,738.78
PublishAndReceiveMessages AtMostOnce 8192 V3_1_1 13.250 μs 2.4129 μs 7.114 μs 9.620 μs 75,470.25
PublishAndReceiveMessages AtLeastOnce 10 V3_1_1 23.111 μs 1.9651 μs 5.794 μs 24.182 μs 43,268.72
PublishAndReceiveMessages AtLeastOnce 1024 V3_1_1 23.023 μs 1.9696 μs 5.807 μs 24.033 μs 43,434.29
PublishAndReceiveMessages AtLeastOnce 2048 V3_1_1 27.093 μs 2.9436 μs 8.679 μs 28.678 μs 36,910.36
PublishAndReceiveMessages AtLeastOnce 8192 V3_1_1 32.266 μs 2.3566 μs 6.948 μs 32.402 μs 30,991.97
PublishAndReceiveMessages ExactlyOnce 10 V3_1_1 42.754 μs 2.3814 μs 7.022 μs 40.309 μs 23,389.38
PublishAndReceiveMessages ExactlyOnce 1024 V3_1_1 41.514 μs 1.9078 μs 5.625 μs 39.755 μs 24,088.12
PublishAndReceiveMessages ExactlyOnce 2048 V3_1_1 40.881 μs 5.7051 μs 16.822 μs 40.495 μs 24,461.15
PublishAndReceiveMessages ExactlyOnce 8192 V3_1_1 52.581 μs 2.4027 μs 7.084 μs 51.804 μs 19,018.14

This PR


BenchmarkDotNet v0.14.0, Windows 11 (10.0.22631.4037/23H2/2023Update/SunValley3)
12th Gen Intel Core i7-1260P, 1 CPU, 16 logical and 12 physical cores
.NET SDK 8.0.302
  [Host]     : .NET 8.0.6 (8.0.624.26715), X64 RyuJIT AVX2
  Job-XKOQDD : .NET 8.0.6 (8.0.624.26715), X64 RyuJIT AVX2

InvocationCount=1  LaunchCount=10  RunStrategy=Monitoring  
UnrollFactor=1  WarmupCount=10  

Method QoSLevel PayloadSizeBytes ProtocolVersion Mean Error StdDev Median Req/sec
PublishAndReceiveMessages AtMostOnce 10 V3_1_1 3.776 μs 0.7134 μs 2.103 μs 2.993 μs 264,832.54
PublishAndReceiveMessages AtMostOnce 1024 V3_1_1 3.528 μs 0.6014 μs 1.773 μs 2.803 μs 283,415.14
PublishAndReceiveMessages AtMostOnce 2048 V3_1_1 4.319 μs 0.6248 μs 1.842 μs 3.870 μs 231,522.29
PublishAndReceiveMessages AtMostOnce 8192 V3_1_1 14.125 μs 2.9633 μs 8.737 μs 10.495 μs 70,798.58
PublishAndReceiveMessages AtLeastOnce 10 V3_1_1 25.145 μs 1.2204 μs 3.598 μs 24.535 μs 39,768.96
PublishAndReceiveMessages AtLeastOnce 1024 V3_1_1 22.786 μs 1.8937 μs 5.584 μs 24.131 μs 43,885.74
PublishAndReceiveMessages AtLeastOnce 2048 V3_1_1 27.929 μs 1.5958 μs 4.705 μs 28.190 μs 35,805.37
PublishAndReceiveMessages AtLeastOnce 8192 V3_1_1 28.807 μs 2.5123 μs 7.408 μs 28.615 μs 34,713.84
PublishAndReceiveMessages ExactlyOnce 10 V3_1_1 39.247 μs 2.3468 μs 6.920 μs 39.792 μs 25,479.42
PublishAndReceiveMessages ExactlyOnce 1024 V3_1_1 39.877 μs 2.1262 μs 6.269 μs 38.985 μs 25,077.39
PublishAndReceiveMessages ExactlyOnce 2048 V3_1_1 43.217 μs 3.9505 μs 11.648 μs 42.917 μs 23,139.00
PublishAndReceiveMessages ExactlyOnce 8192 V3_1_1 51.701 μs 2.3448 μs 6.914 μs 49.587 μs 19,341.96

Looks like about even to me, which isn't a surprise. We should probably add a benchmark that looks at the overhead of decoding multiple packets - that'd be a "cleaner" way of capturing this information.

Aaronontheweb avatar Sep 11 '24 16:09 Aaronontheweb