From 05a1afc70cc02a2ea0eac1438b32f6725eb73073 Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Tue, 13 Jan 2026 18:13:44 +0100 Subject: [PATCH 01/21] Update to Core version with the buffer writer API --- .../NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj | 2 +- .../NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj | 2 +- .../NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj | 2 +- .../NServiceBus.Envelope.CloudEvents.csproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj index 169c858..5419970 100644 --- a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj @@ -18,7 +18,7 @@ - + diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj index 3162ed9..583e1f3 100644 --- a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj index fbc8bf5..2ce7277 100644 --- a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj index cd51163..db7454e 100644 --- a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj +++ b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj @@ -7,7 +7,7 @@ - + From 289cb15e0217074e2370ead9067339202b0ef1d2 Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Tue, 13 Jan 2026 18:14:20 +0100 Subject: [PATCH 02/21] Remove the unwrappers not needed for the perf tests --- .../CloudEventAmqpBinaryEnvelopeHandler.cs | 169 ----------------- .../CloudEventAmqpBinaryEnvelopeUnwrapper.cs | 15 -- .../CloudEventHttpBinaryEnvelopeHandler.cs | 171 ------------------ .../CloudEventHttpBinaryEnvelopeUnwrapper.cs | 15 -- .../EnvelopeUnwrappers.cs | 2 - 5 files changed, 372 deletions(-) delete mode 100644 src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs delete mode 100644 src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs delete mode 100644 src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs delete mode 100644 src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs deleted file mode 100644 index 026c31e..0000000 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs +++ /dev/null @@ -1,169 +0,0 @@ -namespace NServiceBus.Envelope.CloudEvents; - -using System; -using System.Collections.Generic; -using System.Linq; -using Extensibility; -using Logging; - -class CloudEventAmqpBinaryConstants -{ - internal const string HeaderPrefix = "cloudEvents:"; - internal const string TypeProperty = HeaderPrefix + "type"; - internal const string IdProperty = HeaderPrefix + "id"; - internal const string SourceProperty = HeaderPrefix + "source"; - internal const string TimeProperty = HeaderPrefix + "time"; - internal const string VersionProperty = HeaderPrefix + "specversion"; - internal const string SupportedVersion = "1.0"; - internal const string NullLiteral = "null"; - - internal static readonly string[] RequiredHeaders = [IdProperty, SourceProperty, TypeProperty]; -} - -class CloudEventAmqpBinaryEnvelopeHandler(CloudEventsMetrics metrics, CloudEventsConfiguration config) : IEnvelopeHandler -{ - static readonly ILog Log = LogManager.GetLogger(); - - public (Dictionary headers, ReadOnlyMemory body)? UnwrapEnvelope( - string nativeMessageId, IDictionary incomingHeaders, - ContextBag extensions, ReadOnlyMemory incomingBody) - { - metrics.RecordAttemptingToUnwrap(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY); - var caseInsensitiveHeaders = ToCaseInsensitiveDictionary(incomingHeaders); - if (!IsValidMessage(nativeMessageId, caseInsensitiveHeaders)) - { - return null; - } - var headers = ExtractHeaders(nativeMessageId, caseInsensitiveHeaders); - return (headers, incomingBody); - } - - static Dictionary ToCaseInsensitiveDictionary(IDictionary incomingHeaders) => - incomingHeaders - .ToDictionary(p => p.Key, p => p.Value, - StringComparer.OrdinalIgnoreCase); - - Dictionary ExtractHeaders(string nativeMessageId, IDictionary existingHeaders) - { - var headersCopy = existingHeaders.ToDictionary(k => k.Key, k => k.Value); - - headersCopy[Headers.MessageId] = ExtractId(existingHeaders); - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.MessageId], CloudEventJsonStructuredConstants.IdProperty, nativeMessageId); - } - - headersCopy[Headers.ReplyToAddress] = ExtractSource(existingHeaders); - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.ReplyToAddress], CloudEventJsonStructuredConstants.SourceProperty, nativeMessageId); - } - - headersCopy[Headers.EnclosedMessageTypes] = ExtractType(existingHeaders); - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.EnclosedMessageTypes], CloudEventJsonStructuredConstants.TypeProperty, nativeMessageId); - } - - if (existingHeaders.TryGetValue(CloudEventAmqpBinaryConstants.TimeProperty, out var time) - && !string.IsNullOrEmpty(time) && time != CloudEventAmqpBinaryConstants.NullLiteral) - { - /* - * If what comes in is something similar to "2018-04-05T17:31:00Z", compliant with the CloudEvents spec - * and ISO 8601, NServiceBus will not be happy and later in the pipeline there will be a parsing exception - */ - headersCopy[Headers.TimeSent] = DateTimeOffsetHelper.ToWireFormattedString(DateTimeOffset.Parse(time)); - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.TimeSent], CloudEventJsonStructuredConstants.TimeProperty, nativeMessageId); - } - } - else - { - if (Log.IsDebugEnabled) - { - Log.DebugFormat("No time extracted for messageId {0}", nativeMessageId); - } - } - - return headersCopy; - } - - static string ExtractId(IDictionary existingHeaders) => ExtractHeader(existingHeaders, CloudEventAmqpBinaryConstants.IdProperty); - - string ExtractType(IDictionary existingHeaders) - { - var cloudEventType = ExtractHeader(existingHeaders, CloudEventAmqpBinaryConstants.TypeProperty); - return config.TypeMappings.TryGetValue(cloudEventType, out var typeMapping) - ? string.Join(',', typeMapping) - : cloudEventType; - } - - static string ExtractSource(IDictionary existingHeaders) => ExtractHeader(existingHeaders, CloudEventAmqpBinaryConstants.SourceProperty); - - static string ExtractHeader(IDictionary existingHeaders, string property) => existingHeaders[property]; - - bool IsValidMessage(string nativeMessageId, IDictionary headers) - { - if (!HasRequiredHeaders(nativeMessageId, headers)) - { - return false; - } - - metrics.RecordValidMessage(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY); - - if (headers.TryGetValue(CloudEventAmqpBinaryConstants.VersionProperty, out var version)) - { - if (version != CloudEventAmqpBinaryConstants.SupportedVersion) - { - if (Log.IsWarnEnabled) - { - Log.WarnFormat("Unexpected CloudEvent version property value {0} for message {1}", version, nativeMessageId); - } - metrics.RecordUnexpectedVersion(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY, version); - } - else - { - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Correct version field for message {0}", nativeMessageId); - } - metrics.RecordExpectedVersion(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY, - CloudEventAmqpBinaryConstants.SupportedVersion); - } - } - else - { - if (Log.IsWarnEnabled) - { - Log.WarnFormat("CloudEvent version property is missing for message id {0}", nativeMessageId); - } - metrics.RecordUnexpectedVersion(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY, null); - } - - return true; - } - - static bool HasRequiredHeaders(string nativeMessageId, IDictionary incomingHeaders) - { - foreach (var header in CloudEventAmqpBinaryConstants.RequiredHeaders) - { - if (!incomingHeaders.ContainsKey(header)) - { - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Message {0} has no property {1}", nativeMessageId, header); - } - - return false; - } - } - - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Message {0} has all required properties", nativeMessageId); - } - - return true; - } -} diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs deleted file mode 100644 index e94fa8c..0000000 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace NServiceBus.Envelope.CloudEvents; - -using Features; - -/// -/// Unwrapper for AMQP Binary cloud events envelopes. -/// -public class CloudEventAmqpBinaryEnvelopeUnwrapper() : EnvelopeUnwrapper -{ - internal override void RegisterUnwrapper(FeatureConfigurationContext context, Action unwrapperDiagnosticWriter) - { - RegisterUnwrapper(context); - unwrapperDiagnosticWriter(new { EnvelopeHandler = typeof(CloudEventAmqpBinaryEnvelopeHandler) }); - } -} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs deleted file mode 100644 index d5428b1..0000000 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs +++ /dev/null @@ -1,171 +0,0 @@ -namespace NServiceBus.Envelope.CloudEvents; - -using System; -using System.Collections.Generic; -using System.Linq; -using Extensibility; -using Logging; - -class CloudEventHttpBinaryConstants -{ - internal const string HeaderPrefix = "ce-"; - internal const string TypeProperty = HeaderPrefix + "type"; - internal const string IdProperty = HeaderPrefix + "id"; - internal const string SourceProperty = HeaderPrefix + "source"; - internal const string TimeProperty = HeaderPrefix + "time"; - internal const string VersionProperty = HeaderPrefix + "specversion"; - internal const string SupportedVersion = "1.0"; - internal const string NullLiteral = "null"; - - internal static readonly string[] RequiredHeaders = [IdProperty, SourceProperty, TypeProperty]; -} - -class CloudEventHttpBinaryEnvelopeHandler(CloudEventsMetrics metrics, CloudEventsConfiguration config) : IEnvelopeHandler -{ - static readonly ILog Log = LogManager.GetLogger(); - - public (Dictionary headers, ReadOnlyMemory body)? UnwrapEnvelope( - string nativeMessageId, IDictionary incomingHeaders, - ContextBag extensions, ReadOnlyMemory incomingBody) - { - metrics.RecordAttemptingToUnwrap(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY); - var caseInsensitiveHeaders = ToCaseInsensitiveDictionary(incomingHeaders); - if (!IsValidMessage(nativeMessageId, caseInsensitiveHeaders)) - { - return null; - } - var headers = ExtractHeaders(nativeMessageId, caseInsensitiveHeaders); - return (headers, incomingBody); - } - - static Dictionary ToCaseInsensitiveDictionary(IDictionary incomingHeaders) => - incomingHeaders - .ToDictionary(p => p.Key, p => p.Value, - StringComparer.OrdinalIgnoreCase); - - Dictionary ExtractHeaders(string nativeMessageId, IDictionary existingHeaders) - { - var headersCopy = existingHeaders.ToDictionary(k => k.Key, k => k.Value); - - headersCopy[Headers.MessageId] = ExtractId(existingHeaders); - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.MessageId], CloudEventJsonStructuredConstants.IdProperty, nativeMessageId); - } - - headersCopy[Headers.ReplyToAddress] = ExtractSource(existingHeaders); - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.ReplyToAddress], CloudEventJsonStructuredConstants.SourceProperty, nativeMessageId); - } - - headersCopy[Headers.EnclosedMessageTypes] = ExtractType(existingHeaders); - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.EnclosedMessageTypes], CloudEventJsonStructuredConstants.TypeProperty, nativeMessageId); - } - - if (existingHeaders.TryGetValue(CloudEventHttpBinaryConstants.TimeProperty, out var time) && !string.IsNullOrEmpty(time) && time != CloudEventHttpBinaryConstants.NullLiteral) - { - /* - * If what comes in is something similar to "2018-04-05T17:31:00Z", compliant with the CloudEvents spec - * and ISO 8601, NServiceBus will not be happy and later in the pipeline there will be a parsing exception - */ - headersCopy[Headers.TimeSent] = DateTimeOffsetHelper.ToWireFormattedString(DateTimeOffset.Parse(time)); - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.TimeSent], CloudEventJsonStructuredConstants.TimeProperty, nativeMessageId); - } - } - else - { - if (Log.IsDebugEnabled) - { - Log.DebugFormat("No time extracted for messageId {0}", nativeMessageId); - } - } - - return headersCopy; - } - - string ExtractType(IDictionary existingHeaders) - { - var cloudEventType = ExtractHeader(existingHeaders, CloudEventHttpBinaryConstants.TypeProperty); - return config.TypeMappings.TryGetValue(cloudEventType, out var typeMapping) - ? string.Join(',', typeMapping) - : cloudEventType; - } - - static string ExtractId(IDictionary existingHeaders) => - ExtractHeader(existingHeaders, CloudEventHttpBinaryConstants.IdProperty); - - static string ExtractSource(IDictionary existingHeaders) => - ExtractHeader(existingHeaders, CloudEventHttpBinaryConstants.SourceProperty); - - static string ExtractHeader(IDictionary existingHeaders, string property) => - existingHeaders[property]; - - bool IsValidMessage(string nativeMessageId, IDictionary headers) - { - if (!HasRequiredHeaders(nativeMessageId, headers)) - { - return false; - } - - metrics.RecordValidMessage(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY); - - if (headers.TryGetValue(CloudEventHttpBinaryConstants.VersionProperty, out var version)) - { - if (version != CloudEventHttpBinaryConstants.SupportedVersion) - { - if (Log.IsWarnEnabled) - { - Log.WarnFormat("Unexpected CloudEvent version property value {0} for message {1}", version, nativeMessageId); - } - metrics.RecordUnexpectedVersion(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY, version); - } - else - { - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Correct version field for message {0}", nativeMessageId); - } - metrics.RecordExpectedVersion(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY, - CloudEventHttpBinaryConstants.SupportedVersion); - } - } - else - { - if (Log.IsWarnEnabled) - { - Log.WarnFormat("CloudEvent version property is missing for message id {0}", nativeMessageId); - } - metrics.RecordUnexpectedVersion(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY, null); - } - - return true; - } - - static bool HasRequiredHeaders(string nativeMessageId, IDictionary incomingHeaders) - { - foreach (var header in CloudEventHttpBinaryConstants.RequiredHeaders) - { - if (!incomingHeaders.ContainsKey(header)) - { - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Message {0} has no property {1}", nativeMessageId, header); - } - - return false; - } - } - - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Message {0} has all required properties", nativeMessageId); - } - - return true; - } -} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs deleted file mode 100644 index 40f7adc..0000000 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace NServiceBus.Envelope.CloudEvents; - -using Features; - -/// -/// Unwrapper for HTTP Binary cloud events envelopes. -/// -public class CloudEventHttpBinaryEnvelopeUnwrapper() : EnvelopeUnwrapper -{ - internal override void RegisterUnwrapper(FeatureConfigurationContext context, Action unwrapperDiagnosticWriter) - { - RegisterUnwrapper(context); - unwrapperDiagnosticWriter(new { EnvelopeHandler = typeof(CloudEventHttpBinaryEnvelopeHandler) }); - } -} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents/EnvelopeUnwrappers.cs b/src/NServiceBus.Envelope.CloudEvents/EnvelopeUnwrappers.cs index 895d397..4f057a4 100644 --- a/src/NServiceBus.Envelope.CloudEvents/EnvelopeUnwrappers.cs +++ b/src/NServiceBus.Envelope.CloudEvents/EnvelopeUnwrappers.cs @@ -10,8 +10,6 @@ public class EnvelopeUnwrappers : IEnumerable OrderedDictionary Unwrappers { get; } = new() { { typeof(CloudEventJsonStructuredEnvelopeUnwrapper), new CloudEventJsonStructuredEnvelopeUnwrapper() }, - { typeof(CloudEventHttpBinaryEnvelopeUnwrapper), new CloudEventHttpBinaryEnvelopeUnwrapper() }, - { typeof(CloudEventAmqpBinaryEnvelopeUnwrapper), new CloudEventAmqpBinaryEnvelopeUnwrapper() } }; /// From 6032bb03237fa5be44c9d9afdc3e4dfd93b061bf Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Tue, 13 Jan 2026 18:34:15 +0100 Subject: [PATCH 03/21] Update to use the new API based on the buffer writer --- ...loudEventAmqpBinaryEnvelopeHandlerTests.cs | 254 ------------------ ...loudEventHttpBinaryEnvelopeHandlerTests.cs | 254 ------------------ ...EventJsonStructuredEnvelopeHandlerTests.cs | 11 +- ...EventJsonStructuredEnvelopeHandlerTests.cs | 12 +- ...CloudEventJsonStructuredEnvelopeHandler.cs | 38 +-- .../NServiceBus.Envelope.CloudEvents.csproj | 3 + 6 files changed, 42 insertions(+), 530 deletions(-) delete mode 100644 src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs delete mode 100644 src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs deleted file mode 100644 index 79a3f7f..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs +++ /dev/null @@ -1,254 +0,0 @@ -namespace NServiceBus.Envelope.CloudEvents.Tests; - -using System; -using System.Collections.Generic; -using Microsoft.Extensions.Diagnostics.Metrics.Testing; -using System.Text; -using System.Text.Json; -using Extensibility; -using Fakes; -using NServiceBus; -using NUnit.Framework; - -[TestFixture] -class CloudEventAmqpBinaryEnvelopeHandlerTests -{ - internal required TestMeterFactory MeterFactory; - internal required string TestEndpointName; - internal required string NativeMessageId; - internal required Dictionary NativeHeaders; - internal required CloudEventsConfiguration cloudEventsConfiguration; - internal required CloudEventAmqpBinaryEnvelopeHandler EnvelopeHandler; - internal required MetricCollector InvalidMessageCounter; - internal required MetricCollector UnexpectedVersionCounter; - internal required MetricCollector AttemptCounter; - internal required ReadOnlyMemory Body; - - class MyEvent - { - } - - [SetUp] - public void SetUp() - { - NativeMessageId = Guid.NewGuid().ToString(); - cloudEventsConfiguration = new CloudEventsConfiguration - { - TypeMappings = - { - { "com.example.someevent", [typeof(MyEvent)]} - } - }; - NativeHeaders = new Dictionary - { - ["cloudEvents:type"] = "com.example.someevent", - ["cloudEvents:source"] = "/mycontext", - ["cloudEvents:id"] = NativeMessageId, - ["cloudEvents:time"] = "2023-10-10T10:00:00Z", - ["cloudEvents:specversion"] = "1.0" - }; - Body = new ReadOnlyMemory(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(new Dictionary - { - ["some_other_property"] = "some_other_value", - ["data"] = "{}", - }))); - TestEndpointName = "testEndpointName"; - MeterFactory = new(); - - AttemptCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", - "nservicebus.envelope.cloud_events.received.unwrapping_attempt"); - - InvalidMessageCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", - "nservicebus.envelope.cloud_events.received.invalid_message"); - - UnexpectedVersionCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", - "nservicebus.envelope.cloud_events.received.unexpected_version"); - - EnvelopeHandler = new CloudEventAmqpBinaryEnvelopeHandler(new(MeterFactory, TestEndpointName), cloudEventsConfiguration); - } - - [Test] - public void Should_unmarshal_regular_message() - { - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - Assert.Multiple(() => - { - AssertTypicalFields(actual); - Assert.That(actual.Body.Span.SequenceEqual(Body.Span)); - }); - } - - [Test] - public void Should_ignore_missing_time() - { - NativeHeaders.Remove("time"); - - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - AssertTypicalFields(actual, shouldHaveTime: false); - } - - [Test] - public void Should_ignore_empty_time() - { - NativeHeaders["time"] = ""; - - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - AssertTypicalFields(actual, shouldHaveTime: false); - } - - [Test] - public void Should_ignore_null_time() - { - NativeHeaders["time"] = null; - - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - AssertTypicalFields(actual, shouldHaveTime: false); - } - - [Test] - public void Should_ignore_string_null_time() - { - NativeHeaders["time"] = "null"; - - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - AssertTypicalFields(actual, shouldHaveTime: false); - } - - [Test] - public void Should_report_metric_when_unmarshaling_regular_message() - { - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - var invalidMessageCounterSnapshot = InvalidMessageCounter.GetMeasurementSnapshot(); - - Assert.Multiple(() => - { - Assert.That(invalidMessageCounterSnapshot.Count, Is.EqualTo(1)); - Assert.That(invalidMessageCounterSnapshot[0].Value, Is.EqualTo(0)); - Assert.That(invalidMessageCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); - Assert.That(invalidMessageCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], - Is.EqualTo(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY)); - }); - } - - [Test] - public void Should_report_metric_when_unmarshaling_message_with_version() - { - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); - - Assert.Multiple(() => - { - Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); - Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(0)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], - Is.EqualTo(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], - Is.EqualTo("1.0")); - }); - } - - [Test] - public void Should_report_metric_when_unmarshaling_message_without_version() - { - NativeHeaders.Remove("cloudEvents:specversion"); - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); - - Assert.Multiple(() => - { - Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); - Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(1)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], - Is.EqualTo(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], - Is.EqualTo(null)); - }); - } - - [Test] - public void Should_report_metric_when_unmarshaling_message_with_unrecognized_version() - { - NativeHeaders["cloudEvents:specversion"] = "wrong"; - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); - - Assert.Multiple(() => - { - Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); - Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(1)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], - Is.EqualTo(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], - Is.EqualTo("wrong")); - }); - } - - [Test] - [TestCase("cloudEvents:type")] - [TestCase("cloudEvents:id")] - [TestCase("cloudEvents:source")] - public void Should_return_null_when_property_is_missing(string property) - { - NativeHeaders.Remove(property); - - (Dictionary Headers, ReadOnlyMemory Body)? actual = RunEnvelopHandlerTest(); - - Assert.That(actual, Is.Null); - } - - [Test] - [TestCase("cloudEvents:type")] - [TestCase("cloudEvents:id")] - [TestCase("cloudEvents:source")] - public void Should_not_record_metric_when_property_is_missing(string property) - { - NativeHeaders.Remove(property); - RunEnvelopHandlerTest(); - - var invalidMessageCounterSnapshot = InvalidMessageCounter.GetMeasurementSnapshot(); - - Assert.That(invalidMessageCounterSnapshot.Count, Is.EqualTo(0)); - } - - (Dictionary headers, ReadOnlyMemory body)? RunEnvelopHandlerTest() - { - var upperCaseHeaders = NativeHeaders.ToDictionary(k => k.Key.ToUpper(), k => k.Value); - return EnvelopeHandler.UnwrapEnvelope(NativeMessageId, upperCaseHeaders!, new ContextBag(), Body); - } - - void AssertTypicalFields((Dictionary Headers, ReadOnlyMemory Body) actual, bool shouldHaveTime = true) - { - var attemptCounterSnapshot = AttemptCounter.GetMeasurementSnapshot(); - Assert.Multiple(() => - { - Assert.That(actual.Headers[Headers.MessageId], Is.EqualTo(NativeMessageId)); - Assert.That(actual.Headers[Headers.ReplyToAddress], Is.EqualTo(NativeHeaders["cloudEvents:source"])); - if (shouldHaveTime) - { - Assert.That(actual.Headers[Headers.TimeSent], Is.EqualTo("2023-10-10 10:00:00:000000 Z")); - } - - Assert.That(actual.Headers.ContainsKey("data"), Is.False); - Assert.That(actual.Headers.ContainsKey("some_other_property"), Is.False); - Assert.That(actual.Headers[Headers.EnclosedMessageTypes], Is.EqualTo("NServiceBus.Envelope.CloudEvents.Tests.CloudEventAmqpBinaryEnvelopeHandlerTests+MyEvent")); - - Assert.That(attemptCounterSnapshot.Count, Is.EqualTo(1)); - Assert.That(attemptCounterSnapshot[0].Value, Is.EqualTo(1)); - Assert.That(attemptCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); - Assert.That(attemptCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], - Is.EqualTo(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY)); - }); - } -} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs deleted file mode 100644 index a18f602..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs +++ /dev/null @@ -1,254 +0,0 @@ -namespace NServiceBus.Envelope.CloudEvents.Tests; - -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.Json; -using Extensibility; -using Fakes; -using Microsoft.Extensions.Diagnostics.Metrics.Testing; -using NServiceBus; -using NUnit.Framework; - -[TestFixture] -class CloudEventHttpBinaryEnvelopeHandlerTests -{ - internal required TestMeterFactory MeterFactory; - internal required string TestEndpointName; - internal required string NativeMessageId; - internal required Dictionary NativeHeaders; - internal required ReadOnlyMemory Body; - internal required CloudEventHttpBinaryEnvelopeHandler EnvelopeHandler; - internal required MetricCollector InvalidMessageCounter; - internal required MetricCollector UnexpectedVersionCounter; - internal required MetricCollector AttemptCounter; - internal required CloudEventsConfiguration cloudEventsConfiguration; - - class MyEvent - { - } - - [SetUp] - public void SetUp() - { - NativeMessageId = Guid.NewGuid().ToString(); - NativeHeaders = new Dictionary - { - ["ce-type"] = "com.example.someevent", - ["ce-source"] = "/mycontext", - ["ce-id"] = NativeMessageId, - ["ce-time"] = "2023-10-10T10:00:00Z", - ["ce-specversion"] = "1.0" - }; - cloudEventsConfiguration = new CloudEventsConfiguration - { - TypeMappings = - { - { "com.example.someevent", [typeof(MyEvent)] } - } - }; - Body = new ReadOnlyMemory(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(new Dictionary - { - ["some_other_property"] = "some_other_value", - ["data"] = "{}", - }))); - TestEndpointName = "testEndpointName"; - MeterFactory = new(); - - AttemptCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", - "nservicebus.envelope.cloud_events.received.unwrapping_attempt"); - - InvalidMessageCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", - "nservicebus.envelope.cloud_events.received.invalid_message"); - - UnexpectedVersionCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", - "nservicebus.envelope.cloud_events.received.unexpected_version"); - - EnvelopeHandler = new CloudEventHttpBinaryEnvelopeHandler(new(MeterFactory, TestEndpointName), cloudEventsConfiguration); - } - - [Test] - public void Should_unmarshal_regular_message() - { - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - Assert.Multiple(() => - { - AssertTypicalFields(actual); - Assert.That(actual.Body.Span.SequenceEqual(Body.Span)); - }); - } - - [Test] - public void Should_ignore_missing_time() - { - NativeHeaders.Remove("time"); - - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - AssertTypicalFields(actual, shouldHaveTime: false); - } - - [Test] - public void Should_ignore_empty_time() - { - NativeHeaders["time"] = ""; - - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - AssertTypicalFields(actual, shouldHaveTime: false); - } - - [Test] - public void Should_ignore_null_time() - { - NativeHeaders["time"] = null; - - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - AssertTypicalFields(actual, shouldHaveTime: false); - } - - [Test] - public void Should_ignore_string_null_time() - { - NativeHeaders["time"] = "null"; - - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - AssertTypicalFields(actual, shouldHaveTime: false); - } - - [Test] - public void Should_report_metric_when_unmarshaling_regular_message() - { - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - var invalidMessageCounterSnapshot = InvalidMessageCounter.GetMeasurementSnapshot(); - - Assert.Multiple(() => - { - Assert.That(invalidMessageCounterSnapshot.Count, Is.EqualTo(1)); - Assert.That(invalidMessageCounterSnapshot[0].Value, Is.EqualTo(0)); - Assert.That(invalidMessageCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); - Assert.That(invalidMessageCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], - Is.EqualTo(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY)); - }); - } - - [Test] - public void Should_report_metric_when_unmarshaling_message_with_version() - { - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); - - Assert.Multiple(() => - { - Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); - Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(0)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], - Is.EqualTo(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], - Is.EqualTo("1.0")); - }); - } - - [Test] - public void Should_report_metric_when_unmarshaling_message_without_version() - { - NativeHeaders.Remove("ce-specversion"); - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); - - Assert.Multiple(() => - { - Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); - Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(1)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], - Is.EqualTo(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], - Is.EqualTo(null)); - }); - } - - [Test] - public void Should_report_metric_when_unmarshaling_message_with_unrecognized_version() - { - NativeHeaders["ce-specversion"] = "wrong"; - (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; - - var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); - - Assert.Multiple(() => - { - Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); - Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(1)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], - Is.EqualTo(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY)); - Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], - Is.EqualTo("wrong")); - }); - } - - [Test] - [TestCase("ce-type")] - [TestCase("ce-id")] - [TestCase("ce-source")] - public void Should_return_null_when_property_is_missing(string property) - { - NativeHeaders.Remove(property); - - (Dictionary Headers, ReadOnlyMemory Body)? actual = RunEnvelopHandlerTest(); - - Assert.That(actual, Is.Null); - } - - [Test] - [TestCase("ce-type")] - [TestCase("ce-id")] - [TestCase("ce-source")] - public void Should_not_record_metric_when_property_is_missing(string property) - { - NativeHeaders.Remove(property); - RunEnvelopHandlerTest(); - - var invalidMessageCounterSnapshot = InvalidMessageCounter.GetMeasurementSnapshot(); - - Assert.That(invalidMessageCounterSnapshot.Count, Is.EqualTo(0)); - } - - (Dictionary headers, ReadOnlyMemory body)? RunEnvelopHandlerTest() - { - var upperCaseHeaders = NativeHeaders.ToDictionary(k => k.Key.ToUpper(), k => k.Value); - return EnvelopeHandler.UnwrapEnvelope(NativeMessageId, upperCaseHeaders!, new ContextBag(), Body); - } - - void AssertTypicalFields((Dictionary Headers, ReadOnlyMemory Body) actual, bool shouldHaveTime = true) - { - var attemptCounterSnapshot = AttemptCounter.GetMeasurementSnapshot(); - Assert.Multiple(() => - { - Assert.That(actual.Headers[Headers.MessageId], Is.EqualTo(NativeMessageId)); - Assert.That(actual.Headers[Headers.ReplyToAddress], Is.EqualTo(NativeHeaders["ce-source"])); - if (shouldHaveTime) - { - Assert.That(actual.Headers[Headers.TimeSent], Is.EqualTo("2023-10-10 10:00:00:000000 Z")); - } - - Assert.That(actual.Headers.ContainsKey("data"), Is.False); - Assert.That(actual.Headers.ContainsKey("some_other_property"), Is.False); - Assert.That(actual.Headers[Headers.EnclosedMessageTypes], Is.EqualTo("NServiceBus.Envelope.CloudEvents.Tests.CloudEventHttpBinaryEnvelopeHandlerTests+MyEvent")); - - Assert.That(attemptCounterSnapshot.Count, Is.EqualTo(1)); - Assert.That(attemptCounterSnapshot[0].Value, Is.EqualTo(1)); - Assert.That(attemptCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); - Assert.That(attemptCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], - Is.EqualTo(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY)); - }); - } -} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/PermissiveCloudEventJsonStructuredEnvelopeHandlerTests.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/PermissiveCloudEventJsonStructuredEnvelopeHandlerTests.cs index bb97636..7eef2f4 100644 --- a/src/NServiceBus.Envelope.CloudEvents.Tests/PermissiveCloudEventJsonStructuredEnvelopeHandlerTests.cs +++ b/src/NServiceBus.Envelope.CloudEvents.Tests/PermissiveCloudEventJsonStructuredEnvelopeHandlerTests.cs @@ -1,6 +1,7 @@ namespace NServiceBus.Envelope.CloudEvents.Tests; using System; +using System.Buffers; using System.Collections.Generic; using System.Text; using System.Text.Json; @@ -285,7 +286,8 @@ public void Should_record_metric_when_type_is_missing() [Test] public void Should_return_null_for_invalid_body() { - (Dictionary Headers, ReadOnlyMemory Body)? actual = EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, new ContextBag(), new ReadOnlyMemory()); + var bodyWriter = new ArrayBufferWriter(); + Dictionary? actual = EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, ReadOnlySpan.Empty, new ContextBag(), bodyWriter); Assert.That(actual, Is.Null); } @@ -293,7 +295,8 @@ public void Should_return_null_for_invalid_body() [Test] public void Should_emit_metric_for_invalid_body() { - EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, new ContextBag(), new ReadOnlyMemory()); + var bodyWriter = new ArrayBufferWriter(); + EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, ReadOnlySpan.Empty, new ContextBag(), bodyWriter); var attemptCounterSnapshot = AttemptCounter.GetMeasurementSnapshot(); var invalidMessageCounterSnapshot = InvalidMessageCounter.GetMeasurementSnapshot(); @@ -448,7 +451,9 @@ public void Should_record_metric_when_data_base64_property_is_present() var payloadWithUpperCaseKeys = Payload.ToDictionary(p => p.Key.ToUpper(), p => p.Value); string serializedBody = JsonSerializer.Serialize(payloadWithUpperCaseKeys); var fullBody = new ReadOnlyMemory(Encoding.UTF8.GetBytes(serializedBody)); - return EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, new ContextBag(), fullBody); + var bodyWriter = new ArrayBufferWriter(); + var headers = EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, fullBody.Span, new ContextBag(), bodyWriter); + return headers == null ? null : (headers, new ReadOnlyMemory(bodyWriter.WrittenSpan.ToArray())); } void AssertTypicalFields((Dictionary Headers, ReadOnlyMemory body) actual, bool shouldHaveTime = true) diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs index c081ef5..a2372eb 100644 --- a/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs +++ b/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs @@ -1,6 +1,7 @@ namespace NServiceBus.Envelope.CloudEvents.Tests; using System; +using System.Buffers; using System.Collections.Generic; using System.Text; using System.Text.Json; @@ -423,7 +424,8 @@ public void Should_throw_for_invalid_body() { Assert.Throws(() => { - EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, new ContextBag(), new ReadOnlyMemory()); + var bodyWriter = new ArrayBufferWriter(); + EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, ReadOnlySpan.Empty, new ContextBag(), bodyWriter); }); } @@ -432,8 +434,8 @@ public void Should_emit_metric_for_invalid_body() { try { - EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, new ContextBag(), - new ReadOnlyMemory()); + var bodyWriter = new ArrayBufferWriter(); + EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, ReadOnlySpan.Empty, new ContextBag(), bodyWriter); } catch (Exception) { @@ -464,7 +466,9 @@ public void Should_emit_metric_for_invalid_body() var payloadWithUpperCaseKeys = Payload.ToDictionary(p => p.Key.ToUpper(), p => p.Value); string serializedBody = JsonSerializer.Serialize(payloadWithUpperCaseKeys); var fullBody = new ReadOnlyMemory(Encoding.UTF8.GetBytes(serializedBody)); - return EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, new ContextBag(), fullBody); + var bodyWriter = new ArrayBufferWriter(); + var headers = EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, fullBody.Span, new ContextBag(), bodyWriter); + return headers == null ? null : (headers, new ReadOnlyMemory(bodyWriter.WrittenSpan.ToArray())); } void AssertTypicalFields((Dictionary Headers, ReadOnlyMemory body) actual, bool shouldHaveTime = true) diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeHandler.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeHandler.cs index 0e8fbab..f9f1bf6 100644 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeHandler.cs +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeHandler.cs @@ -1,5 +1,6 @@ namespace NServiceBus.Envelope.CloudEvents; +using System.Buffers; using System.Diagnostics.CodeAnalysis; using System.Text; using System.Text.Json; @@ -30,7 +31,7 @@ class CloudEventJsonStructuredEnvelopeHandler(CloudEventsMetrics metrics, CloudE static readonly ILog Log = LogManager.GetLogger(); static readonly JsonSerializerOptions Options = new() { PropertyNameCaseInsensitive = true }; - public (Dictionary headers, ReadOnlyMemory body)? UnwrapEnvelope(string nativeMessageId, IDictionary incomingHeaders, ContextBag extensions, ReadOnlyMemory incomingBody) + public Dictionary? UnwrapEnvelope(string nativeMessageId, IDictionary incomingHeaders, ReadOnlySpan incomingBody, ContextBag extensions, IBufferWriter bodyWriter) { var isStrict = config.EnvelopeUnwrappers.Find().EnvelopeHandlingMode == JsonStructureEnvelopeHandlingMode.Strict; @@ -38,9 +39,13 @@ class CloudEventJsonStructuredEnvelopeHandler(CloudEventsMetrics metrics, CloudE ? StrictHandler.DeserializeOrThrow(nativeMessageId, incomingHeaders, incomingBody, metrics) : PermissiveHandler.DeserializeOrThrow(nativeMessageId, incomingBody, metrics); - return receivedCloudEvent == null - ? null - : (ExtractHeaders(nativeMessageId, incomingHeaders, receivedCloudEvent), ExtractBody(nativeMessageId, receivedCloudEvent)); + if (receivedCloudEvent == null) + { + return null; + } + + ExtractBody(nativeMessageId, receivedCloudEvent, bodyWriter); + return ExtractHeaders(nativeMessageId, incomingHeaders, receivedCloudEvent); } Dictionary ExtractHeaders(string nativeMessageId, IDictionary existingHeaders, @@ -138,7 +143,7 @@ string ExtractType(Dictionary receivedCloudEvent) : cloudEventType; } - static ReadOnlyMemory ExtractBody(string nativeMessageId, Dictionary receivedCloudEvent) + static void ExtractBody(string nativeMessageId, Dictionary receivedCloudEvent, IBufferWriter bodyWriter) { if (TryGetHeader(receivedCloudEvent, CloudEventJsonStructuredConstants.DataBase64Property, out var base64Body)) { @@ -146,7 +151,9 @@ static ReadOnlyMemory ExtractBody(string nativeMessageId, Dictionary(Convert.FromBase64String(base64Body)); + var bytes = Convert.FromBase64String(base64Body); + bodyWriter.Write(bytes); + return; } if (receivedCloudEvent.TryGetValue(CloudEventJsonStructuredConstants.DataProperty, out var data)) @@ -163,8 +170,9 @@ static ReadOnlyMemory ExtractBody(string nativeMessageId, Dictionary(Encoding.UTF8.GetBytes( - data.Value.GetString()!)); + var bytes = Encoding.UTF8.GetBytes(data.Value.GetString()!); + bodyWriter.Write(bytes); + return; } if (Log.IsDebugEnabled) @@ -173,8 +181,9 @@ static ReadOnlyMemory ExtractBody(string nativeMessageId, Dictionary(Encoding.UTF8.GetBytes( - data.Value.GetRawText())); + var bytes = Encoding.UTF8.GetBytes(data.Value.GetRawText()); + bodyWriter.Write(bytes); + return; } } @@ -182,7 +191,6 @@ static ReadOnlyMemory ExtractBody(string nativeMessageId, Dictionary(); } static bool TryGetHeader(Dictionary receivedCloudEvent, string header, [MaybeNullWhen(false)] out string result) @@ -214,7 +222,7 @@ static class StrictHandler internal static Dictionary? DeserializeOrThrow(string nativeMessageId, IDictionary incomingHeaders, - ReadOnlyMemory body, CloudEventsMetrics metrics) + ReadOnlySpan body, CloudEventsMetrics metrics) { if (!HasCorrectContentTypeHeader(incomingHeaders)) { @@ -235,7 +243,7 @@ static class StrictHandler JsonDocument? receivedCloudEvent; try { - receivedCloudEvent = JsonSerializer.Deserialize(body.Span, Options); + receivedCloudEvent = JsonSerializer.Deserialize(body, Options); } catch (Exception e) { @@ -339,14 +347,14 @@ static void ThrowIfInvalidCloudEventAndRecordMetrics(string nativeMessageId, static class PermissiveHandler { internal static Dictionary? DeserializeOrThrow(string nativeMessageId, - ReadOnlyMemory body, CloudEventsMetrics metrics) + ReadOnlySpan body, CloudEventsMetrics metrics) { metrics.RecordAttemptingToUnwrap(CloudEventsMetrics.CloudEventTypes.JSON_STRUCTURED_PERMISSIVE); JsonDocument? receivedCloudEvent; try { - receivedCloudEvent = JsonSerializer.Deserialize(body.Span, Options); + receivedCloudEvent = JsonSerializer.Deserialize(body, Options); } catch (Exception e) { diff --git a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj index db7454e..4afc3db 100644 --- a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj +++ b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj @@ -32,6 +32,9 @@ <_Parameter1>NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests + + <_Parameter1>NServiceBus.Envelope.CloudEvents.Benchmarks + From 65d67f3210c61f6cde336d36ec2852498e4e3d84 Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Tue, 13 Jan 2026 18:35:19 +0100 Subject: [PATCH 04/21] benchmarks --- ...elopeHandlerBenchmarks-20260113-183448.log | 5 + ...JsonStructuredEnvelopeHandlerBenchmarks.cs | 299 ++++++++++++++++++ .../FakeMeterFactory.cs | 23 ++ ...Bus.Envelope.CloudEvents.Benchmarks.csproj | 18 ++ .../Program.cs | 11 + .../README.md | 64 ++++ 6 files changed, 420 insertions(+) create mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-183448.log create mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/CloudEventJsonStructuredEnvelopeHandlerBenchmarks.cs create mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/FakeMeterFactory.cs create mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/NServiceBus.Envelope.CloudEvents.Benchmarks.csproj create mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/Program.cs create mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/README.md diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-183448.log b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-183448.log new file mode 100644 index 0000000..b1d9d05 --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-183448.log @@ -0,0 +1,5 @@ +// Validating benchmarks: +// * Assembly NServiceBus.Envelope.CloudEvents.Benchmarks which defines benchmarks references non-optimized NServiceBus.Core + If you own this dependency, please, build it in RELEASE. + If you don't, you can disable this policy by using 'config.WithOptions(ConfigOptions.DisableOptimizationsValidator)'. + diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/CloudEventJsonStructuredEnvelopeHandlerBenchmarks.cs b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/CloudEventJsonStructuredEnvelopeHandlerBenchmarks.cs new file mode 100644 index 0000000..01307d8 --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/CloudEventJsonStructuredEnvelopeHandlerBenchmarks.cs @@ -0,0 +1,299 @@ +namespace NServiceBus.Envelope.CloudEvents.Benchmarks; + +using System.Buffers; +using System.Text; +using System.Text.Json; +using BenchmarkDotNet.Attributes; +using Extensibility; + +[MemoryDiagnoser] +[SimpleJob(warmupCount: 3, iterationCount: 10)] +public class CloudEventJsonStructuredEnvelopeHandlerBenchmarks +{ + CloudEventJsonStructuredEnvelopeHandler? _permissiveHandler; + CloudEventJsonStructuredEnvelopeHandler? _strictHandler; + Dictionary? _headers; + byte[]? _smallJsonPayload; + byte[]? _mediumJsonPayload; + byte[]? _largeJsonPayload; + byte[]? _base64Payload; + byte[]? _xmlPayload; + string? _nativeMessageId; + + class MyEvent; + + [GlobalSetup] + public void Setup() + { + _nativeMessageId = Guid.NewGuid().ToString(); + + _headers = new Dictionary + { + [Headers.ContentType] = "application/cloudevents+json; charset=utf8" + }; + + // Configure permissive handler + var permissiveConfig = new CloudEventsConfiguration + { + TypeMappings = + { + { "com.example.someevent", [typeof(MyEvent)] }, + } + }; + permissiveConfig.EnvelopeUnwrappers.Find() + .EnvelopeHandlingMode = JsonStructureEnvelopeHandlingMode.Permissive; + + _permissiveHandler = new CloudEventJsonStructuredEnvelopeHandler( + new CloudEventsMetrics(new FakeMeterFactory(), "benchmark"), + permissiveConfig); + + // Configure strict handler + var strictConfig = new CloudEventsConfiguration + { + TypeMappings = + { + { "com.example.someevent", [typeof(MyEvent)] }, + } + }; + strictConfig.EnvelopeUnwrappers.Find() + .EnvelopeHandlingMode = JsonStructureEnvelopeHandlingMode.Strict; + + _strictHandler = new CloudEventJsonStructuredEnvelopeHandler( + new CloudEventsMetrics(new FakeMeterFactory(), "benchmark"), + strictConfig); + + // Create small JSON payload (typical small message) + _smallJsonPayload = CreateJsonPayload(new Dictionary + { + ["property"] = "value" + }); + + // Create medium JSON payload (typical business message) + _mediumJsonPayload = CreateJsonPayload(new Dictionary + { + ["orderId"] = "12345", + ["customerId"] = "67890", + ["orderDate"] = "2024-01-13T10:00:00Z", + ["items"] = new[] + { + new { productId = "P1", quantity = 2, price = 29.99 }, + new { productId = "P2", quantity = 1, price = 49.99 }, + new { productId = "P3", quantity = 3, price = 9.99 } + }, + ["totalAmount"] = 139.94, + ["shippingAddress"] = new + { + street = "123 Main St", + city = "Springfield", + state = "IL", + zipCode = "62701", + country = "USA" + } + }); + + // Create large JSON payload (large complex message) + var largeData = new Dictionary + { + ["metadata"] = new + { + version = "1.0", + timestamp = DateTime.UtcNow, + correlationId = Guid.NewGuid().ToString() + } + }; + + var items = new List(); + for (int i = 0; i < 100; i++) + { + items.Add(new + { + id = i, + name = $"Item {i}", + description = $"This is a detailed description for item {i}", + properties = new Dictionary + { + ["prop1"] = "value1", + ["prop2"] = "value2", + ["prop3"] = "value3" + } + }); + } + largeData["items"] = items; + _largeJsonPayload = CreateJsonPayload(largeData); + + // Create base64 binary payload + var binaryData = Encoding.UTF8.GetBytes("Some XML or binary content here"); + _base64Payload = CreateBase64Payload(binaryData); + + // Create XML payload + _xmlPayload = CreateXmlPayload("12345John Doe"); + } + + byte[] CreateJsonPayload(object data) + { + var cloudEvent = new Dictionary + { + ["TYPE"] = "com.example.someevent", + ["SOURCE"] = "/mycontext", + ["ID"] = Guid.NewGuid().ToString(), + ["DATA"] = data, + ["DATACONTENTTYPE"] = "application/json", + ["TIME"] = "2024-01-13T10:00:00Z", + ["SPECVERSION"] = "1.0" + }; + + return Encoding.UTF8.GetBytes(JsonSerializer.Serialize(cloudEvent)); + } + + byte[] CreateBase64Payload(byte[] binaryData) + { + var cloudEvent = new Dictionary + { + ["TYPE"] = "com.example.someevent", + ["SOURCE"] = "/mycontext", + ["ID"] = Guid.NewGuid().ToString(), + ["DATA_BASE64"] = Convert.ToBase64String(binaryData), + ["DATACONTENTTYPE"] = "application/xml", + ["TIME"] = "2024-01-13T10:00:00Z", + ["SPECVERSION"] = "1.0" + }; + + return Encoding.UTF8.GetBytes(JsonSerializer.Serialize(cloudEvent)); + } + + byte[] CreateXmlPayload(string xmlData) + { + var cloudEvent = new Dictionary + { + ["TYPE"] = "com.example.someevent", + ["SOURCE"] = "/mycontext", + ["ID"] = Guid.NewGuid().ToString(), + ["DATA"] = xmlData, + ["DATACONTENTTYPE"] = "application/xml", + ["TIME"] = "2024-01-13T10:00:00Z", + ["SPECVERSION"] = "1.0" + }; + + return Encoding.UTF8.GetBytes(JsonSerializer.Serialize(cloudEvent)); + } + + [Benchmark(Description = "Permissive mode - Small JSON payload")] + public Dictionary? PermissiveMode_SmallJson() + { + var bodyWriter = new ArrayBufferWriter(); + return _permissiveHandler!.UnwrapEnvelope( + _nativeMessageId!, + _headers!, + _smallJsonPayload.AsSpan(), + new ContextBag(), + bodyWriter); + } + + [Benchmark(Description = "Strict mode - Small JSON payload")] + public Dictionary? StrictMode_SmallJson() + { + var bodyWriter = new ArrayBufferWriter(); + return _strictHandler!.UnwrapEnvelope( + _nativeMessageId!, + _headers!, + _smallJsonPayload.AsSpan(), + new ContextBag(), + bodyWriter); + } + + [Benchmark(Description = "Permissive mode - Medium JSON payload")] + public Dictionary? PermissiveMode_MediumJson() + { + var bodyWriter = new ArrayBufferWriter(); + return _permissiveHandler!.UnwrapEnvelope( + _nativeMessageId!, + _headers!, + _mediumJsonPayload.AsSpan(), + new ContextBag(), + bodyWriter); + } + + [Benchmark(Description = "Strict mode - Medium JSON payload")] + public Dictionary? StrictMode_MediumJson() + { + var bodyWriter = new ArrayBufferWriter(); + return _strictHandler!.UnwrapEnvelope( + _nativeMessageId!, + _headers!, + _mediumJsonPayload.AsSpan(), + new ContextBag(), + bodyWriter); + } + + [Benchmark(Description = "Permissive mode - Large JSON payload")] + public Dictionary? PermissiveMode_LargeJson() + { + var bodyWriter = new ArrayBufferWriter(); + return _permissiveHandler!.UnwrapEnvelope( + _nativeMessageId!, + _headers!, + _largeJsonPayload.AsSpan(), + new ContextBag(), + bodyWriter); + } + + [Benchmark(Description = "Strict mode - Large JSON payload")] + public Dictionary? StrictMode_LargeJson() + { + var bodyWriter = new ArrayBufferWriter(); + return _strictHandler!.UnwrapEnvelope( + _nativeMessageId!, + _headers!, + _largeJsonPayload.AsSpan(), + new ContextBag(), + bodyWriter); + } + + [Benchmark(Description = "Permissive mode - Base64 binary payload")] + public Dictionary? PermissiveMode_Base64() + { + var bodyWriter = new ArrayBufferWriter(); + return _permissiveHandler!.UnwrapEnvelope( + _nativeMessageId!, + _headers!, + _base64Payload.AsSpan(), + new ContextBag(), + bodyWriter); + } + + [Benchmark(Description = "Strict mode - Base64 binary payload")] + public Dictionary? StrictMode_Base64() + { + var bodyWriter = new ArrayBufferWriter(); + return _strictHandler!.UnwrapEnvelope( + _nativeMessageId!, + _headers!, + _base64Payload.AsSpan(), + new ContextBag(), + bodyWriter); + } + + [Benchmark(Description = "Permissive mode - XML payload")] + public Dictionary? PermissiveMode_Xml() + { + var bodyWriter = new ArrayBufferWriter(); + return _permissiveHandler!.UnwrapEnvelope( + _nativeMessageId!, + _headers!, + _xmlPayload.AsSpan(), + new ContextBag(), + bodyWriter); + } + + [Benchmark(Description = "Strict mode - XML payload", Baseline = true)] + public Dictionary? StrictMode_Xml() + { + var bodyWriter = new ArrayBufferWriter(); + return _strictHandler!.UnwrapEnvelope( + _nativeMessageId!, + _headers!, + _xmlPayload.AsSpan(), + new ContextBag(), + bodyWriter); + } +} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/FakeMeterFactory.cs b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/FakeMeterFactory.cs new file mode 100644 index 0000000..92df7e2 --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/FakeMeterFactory.cs @@ -0,0 +1,23 @@ +namespace NServiceBus.Envelope.CloudEvents.Benchmarks; + +using System.Diagnostics.Metrics; + +class FakeMeterFactory : IMeterFactory +{ + readonly List _meters = []; + + public void Dispose() + { + foreach (var meter in _meters) + { + meter.Dispose(); + } + } + + public Meter Create(MeterOptions options) + { + var meter = new Meter(options); + _meters.Add(meter); + return meter; + } +} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/NServiceBus.Envelope.CloudEvents.Benchmarks.csproj b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/NServiceBus.Envelope.CloudEvents.Benchmarks.csproj new file mode 100644 index 0000000..3ef821f --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/NServiceBus.Envelope.CloudEvents.Benchmarks.csproj @@ -0,0 +1,18 @@ + + + + Exe + net10.0 + enable + enable + + + + + + + + + + + \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/Program.cs b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/Program.cs new file mode 100644 index 0000000..437ed9e --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/Program.cs @@ -0,0 +1,11 @@ +namespace NServiceBus.Envelope.CloudEvents.Benchmarks; + +using BenchmarkDotNet.Running; + +static class Program +{ + public static void Main(string[] args) + { + BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args); + } +} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/README.md b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/README.md new file mode 100644 index 0000000..4e06eb2 --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/README.md @@ -0,0 +1,64 @@ +# NServiceBus.Envelope.CloudEvents Benchmarks + +This project contains performance benchmarks for the CloudEvents envelope unwrapper, specifically for JSON Structured CloudEvents. + +## Running the Benchmarks + +To run all benchmarks: + +```bash +cd src/NServiceBus.Envelope.CloudEvents.Benchmarks +dotnet run -c Release +``` + +To run specific benchmarks: + +```bash +dotnet run -c Release --filter "*SmallJson*" +``` + +To list all available benchmarks: + +```bash +dotnet run -c Release --list flat +``` + +## Benchmark Scenarios + +The benchmarks test the `CloudEventJsonStructuredEnvelopeHandler` with various scenarios: + +### Handler Modes +- **Permissive Mode**: More lenient CloudEvents validation +- **Strict Mode**: Strict CloudEvents validation with Content-Type checking + +### Payload Types +- **Small JSON**: Simple JSON object with a single property +- **Medium JSON**: Typical business message with order details +- **Large JSON**: Complex message with 100 items and nested properties +- **Base64 Binary**: Binary data encoded as base64 +- **XML**: XML payload in the data field + +## Benchmark Configuration + +- **MemoryDiagnoser**: Enabled to track memory allocations +- **Warmup Count**: 3 iterations +- **Iteration Count**: 10 iterations per benchmark +- **Baseline**: `StrictMode_Xml` is set as the baseline for comparison + +## Results + +Results are stored in `BenchmarkDotNet.Artifacts` directory after running the benchmarks. Look for: +- `results/` - Contains markdown, HTML, and CSV formatted results +- Detailed performance metrics including: + - Mean execution time + - Standard deviation + - Memory allocations (Gen0, Gen1, Gen2, and total allocated) + - Comparison ratios to baseline + +## Understanding the Results + +The benchmarks help identify: +- Performance differences between Strict and Permissive modes +- Impact of payload size on processing time +- Memory allocation patterns +- Efficiency of the buffer writer API \ No newline at end of file From 3c9b1606511b7eca3a01f013b4547d7674370465 Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Tue, 13 Jan 2026 20:14:24 +0100 Subject: [PATCH 05/21] Use Core compiled in Release mode --- .../NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj | 2 +- .../NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj | 2 +- .../NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj | 2 +- .../NServiceBus.Envelope.CloudEvents.csproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj index 5419970..bc816f5 100644 --- a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj @@ -18,7 +18,7 @@ - + diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj index 583e1f3..dc39d42 100644 --- a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj index 2ce7277..6f05c7e 100644 --- a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj index 4afc3db..b4691af 100644 --- a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj +++ b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj @@ -7,7 +7,7 @@ - + From dd71a2db750f2b0b1d45b32386efefd6ed256907 Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Tue, 13 Jan 2026 20:15:25 +0100 Subject: [PATCH 06/21] Benchmark results --- ...elopeHandlerBenchmarks-20260113-184728.log | 1064 +++++++++++++++++ 1 file changed, 1064 insertions(+) create mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-184728.log diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-184728.log b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-184728.log new file mode 100644 index 0000000..0f12fdc --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-184728.log @@ -0,0 +1,1064 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 10 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:IntermediateOutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/obj/Release/net10.0/" /p:OutDir="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/" /p:OutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/" in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b +// command took 0.76 sec and exited with 0 +// start dotnet build -c Release --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:IntermediateOutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/obj/Release/net10.0/" /p:OutDir="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/" /p:OutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/" --output "/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/" in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b +// command took 7.82 sec and exited with 0 +// ***** Done, took 00:00:08 (8.64 sec) ***** +// Found 10 benchmarks: +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) + +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_SmallJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 0 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-OFXFZH(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 172708.00 ns, 172.7080 us/op +2026-01-13 18:47:37.689 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 39990542.00 ns, 39.9905 ms/op + +WorkloadPilot 1: 2 op, 116875.00 ns, 58.4375 us/op +WorkloadPilot 2: 3 op, 38250.00 ns, 12.7500 us/op +WorkloadPilot 3: 4 op, 60834.00 ns, 15.2085 us/op +WorkloadPilot 4: 5 op, 115250.00 ns, 23.0500 us/op +WorkloadPilot 5: 6 op, 80750.00 ns, 13.4583 us/op +WorkloadPilot 6: 7 op, 85458.00 ns, 12.2083 us/op +WorkloadPilot 7: 8 op, 125458.00 ns, 15.6823 us/op +WorkloadPilot 8: 9 op, 94458.00 ns, 10.4953 us/op +WorkloadPilot 9: 10 op, 91750.00 ns, 9.1750 us/op +WorkloadPilot 10: 11 op, 90292.00 ns, 8.2084 us/op +WorkloadPilot 11: 12 op, 99709.00 ns, 8.3091 us/op +WorkloadPilot 12: 13 op, 106500.00 ns, 8.1923 us/op +WorkloadPilot 13: 14 op, 110958.00 ns, 7.9256 us/op +WorkloadPilot 14: 15 op, 118042.00 ns, 7.8695 us/op +WorkloadPilot 15: 16 op, 127875.00 ns, 7.9922 us/op +WorkloadPilot 16: 32 op, 244584.00 ns, 7.6433 us/op +WorkloadPilot 17: 64 op, 521291.00 ns, 8.1452 us/op +WorkloadPilot 18: 128 op, 1054959.00 ns, 8.2419 us/op +WorkloadPilot 19: 256 op, 2075458.00 ns, 8.1073 us/op +WorkloadPilot 20: 512 op, 4303625.00 ns, 8.4055 us/op +WorkloadPilot 21: 1024 op, 8334000.00 ns, 8.1387 us/op +WorkloadPilot 22: 2048 op, 17279666.00 ns, 8.4373 us/op +WorkloadPilot 23: 4096 op, 33155792.00 ns, 8.0947 us/op +WorkloadPilot 24: 8192 op, 70558875.00 ns, 8.6131 us/op +WorkloadPilot 25: 16384 op, 138784084.00 ns, 8.4707 us/op +WorkloadPilot 26: 32768 op, 269693458.00 ns, 8.2304 us/op +WorkloadPilot 27: 65536 op, 237823292.00 ns, 3.6289 us/op +WorkloadPilot 28: 131072 op, 261471291.00 ns, 1.9949 us/op +WorkloadPilot 29: 262144 op, 521624667.00 ns, 1.9898 us/op + +WorkloadWarmup 1: 262144 op, 522352125.00 ns, 1.9926 us/op +WorkloadWarmup 2: 262144 op, 521782667.00 ns, 1.9904 us/op +WorkloadWarmup 3: 262144 op, 522261542.00 ns, 1.9923 us/op + +// BeforeActualRun +WorkloadActual 1: 262144 op, 523039833.00 ns, 1.9952 us/op +WorkloadActual 2: 262144 op, 522718958.00 ns, 1.9940 us/op +WorkloadActual 3: 262144 op, 522054292.00 ns, 1.9915 us/op +WorkloadActual 4: 262144 op, 522140250.00 ns, 1.9918 us/op +WorkloadActual 5: 262144 op, 520945209.00 ns, 1.9872 us/op +WorkloadActual 6: 262144 op, 522377125.00 ns, 1.9927 us/op +WorkloadActual 7: 262144 op, 521105333.00 ns, 1.9879 us/op +WorkloadActual 8: 262144 op, 520338083.00 ns, 1.9849 us/op +WorkloadActual 9: 262144 op, 526565000.00 ns, 2.0087 us/op +WorkloadActual 10: 262144 op, 532352083.00 ns, 2.0308 us/op + +// AfterActualRun +WorkloadResult 1: 262144 op, 523039833.00 ns, 1.9952 us/op +WorkloadResult 2: 262144 op, 522718958.00 ns, 1.9940 us/op +WorkloadResult 3: 262144 op, 522054292.00 ns, 1.9915 us/op +WorkloadResult 4: 262144 op, 522140250.00 ns, 1.9918 us/op +WorkloadResult 5: 262144 op, 520945209.00 ns, 1.9872 us/op +WorkloadResult 6: 262144 op, 522377125.00 ns, 1.9927 us/op +WorkloadResult 7: 262144 op, 521105333.00 ns, 1.9879 us/op +WorkloadResult 8: 262144 op, 520338083.00 ns, 1.9849 us/op +// GC: 174 1 0 1094783016 262144 +// Threading: 0 0 262144 + +// AfterAll +// Benchmark Process 9698 has exited with code 0. + +Mean = 1.991 μs, StdErr = 0.001 μs (0.06%), N = 8, StdDev = 0.004 μs +Min = 1.985 μs, Q1 = 1.988 μs, Median = 1.992 μs, Q3 = 1.993 μs, Max = 1.995 μs +IQR = 0.005 μs, LowerFence = 1.980 μs, UpperFence = 2.001 μs +ConfidenceInterval = [1.984 μs; 1.998 μs] (CI 99.9%), Margin = 0.007 μs (0.35% of Mean) +Skewness = -0.28, Kurtosis = 1.38, MValue = 2 + +// ** Remained 9 (90,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 1m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_SmallJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 1 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-YAVIDK(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 162583.00 ns, 162.5830 us/op +2026-01-13 18:47:46.879 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 39188458.00 ns, 39.1885 ms/op + +WorkloadPilot 1: 2 op, 91000.00 ns, 45.5000 us/op +WorkloadPilot 2: 3 op, 60708.00 ns, 20.2360 us/op +WorkloadPilot 3: 4 op, 51833.00 ns, 12.9583 us/op +WorkloadPilot 4: 5 op, 73000.00 ns, 14.6000 us/op +WorkloadPilot 5: 6 op, 62750.00 ns, 10.4583 us/op +WorkloadPilot 6: 7 op, 71125.00 ns, 10.1607 us/op +WorkloadPilot 7: 8 op, 71292.00 ns, 8.9115 us/op +WorkloadPilot 8: 9 op, 77583.00 ns, 8.6203 us/op +WorkloadPilot 9: 10 op, 85416.00 ns, 8.5416 us/op +WorkloadPilot 10: 11 op, 91833.00 ns, 8.3485 us/op +WorkloadPilot 11: 12 op, 99166.00 ns, 8.2638 us/op +WorkloadPilot 12: 13 op, 117458.00 ns, 9.0352 us/op +WorkloadPilot 13: 14 op, 121166.00 ns, 8.6547 us/op +WorkloadPilot 14: 15 op, 124959.00 ns, 8.3306 us/op +WorkloadPilot 15: 16 op, 157042.00 ns, 9.8151 us/op +WorkloadPilot 16: 32 op, 317084.00 ns, 9.9089 us/op +WorkloadPilot 17: 64 op, 506875.00 ns, 7.9199 us/op +WorkloadPilot 18: 128 op, 982291.00 ns, 7.6741 us/op +WorkloadPilot 19: 256 op, 2064125.00 ns, 8.0630 us/op +WorkloadPilot 20: 512 op, 4396000.00 ns, 8.5859 us/op +WorkloadPilot 21: 1024 op, 8847000.00 ns, 8.6396 us/op +WorkloadPilot 22: 2048 op, 17572792.00 ns, 8.5805 us/op +WorkloadPilot 23: 4096 op, 33320041.00 ns, 8.1348 us/op +WorkloadPilot 24: 8192 op, 65593875.00 ns, 8.0071 us/op +WorkloadPilot 25: 16384 op, 144669667.00 ns, 8.8299 us/op +WorkloadPilot 26: 32768 op, 266752792.00 ns, 8.1406 us/op +WorkloadPilot 27: 65536 op, 251084583.00 ns, 3.8312 us/op +WorkloadPilot 28: 131072 op, 270988625.00 ns, 2.0675 us/op +WorkloadPilot 29: 262144 op, 537412708.00 ns, 2.0501 us/op + +WorkloadWarmup 1: 262144 op, 536533375.00 ns, 2.0467 us/op +WorkloadWarmup 2: 262144 op, 535661541.00 ns, 2.0434 us/op +WorkloadWarmup 3: 262144 op, 536676875.00 ns, 2.0473 us/op + +// BeforeActualRun +WorkloadActual 1: 262144 op, 543931500.00 ns, 2.0749 us/op +WorkloadActual 2: 262144 op, 535021708.00 ns, 2.0409 us/op +WorkloadActual 3: 262144 op, 534802209.00 ns, 2.0401 us/op +WorkloadActual 4: 262144 op, 535902375.00 ns, 2.0443 us/op +WorkloadActual 5: 262144 op, 534677583.00 ns, 2.0396 us/op +WorkloadActual 6: 262144 op, 534955292.00 ns, 2.0407 us/op +WorkloadActual 7: 262144 op, 534688834.00 ns, 2.0397 us/op +WorkloadActual 8: 262144 op, 536390125.00 ns, 2.0462 us/op +WorkloadActual 9: 262144 op, 538743334.00 ns, 2.0551 us/op +WorkloadActual 10: 262144 op, 534104000.00 ns, 2.0374 us/op + +// AfterActualRun +WorkloadResult 1: 262144 op, 535021708.00 ns, 2.0409 us/op +WorkloadResult 2: 262144 op, 534802209.00 ns, 2.0401 us/op +WorkloadResult 3: 262144 op, 535902375.00 ns, 2.0443 us/op +WorkloadResult 4: 262144 op, 534677583.00 ns, 2.0396 us/op +WorkloadResult 5: 262144 op, 534955292.00 ns, 2.0407 us/op +WorkloadResult 6: 262144 op, 534688834.00 ns, 2.0397 us/op +WorkloadResult 7: 262144 op, 536390125.00 ns, 2.0462 us/op +WorkloadResult 8: 262144 op, 534104000.00 ns, 2.0374 us/op +// GC: 174 1 0 1094783016 262144 +// Threading: 0 0 262144 + +// AfterAll +// Benchmark Process 9700 has exited with code 0. + +Mean = 2.041 μs, StdErr = 0.001 μs (0.05%), N = 8, StdDev = 0.003 μs +Min = 2.037 μs, Q1 = 2.040 μs, Median = 2.040 μs, Q3 = 2.042 μs, Max = 2.046 μs +IQR = 0.002 μs, LowerFence = 2.036 μs, UpperFence = 2.045 μs +ConfidenceInterval = [2.036 μs; 2.046 μs] (CI 99.9%), Margin = 0.005 μs (0.26% of Mean) +Skewness = 0.59, Kurtosis = 1.93, MValue = 2 + +// ** Remained 8 (80,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 1m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_MediumJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 2 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-BGKEIN(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 157250.00 ns, 157.2500 us/op +2026-01-13 18:47:56.258 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 41437584.00 ns, 41.4376 ms/op + +WorkloadPilot 1: 2 op, 87458.00 ns, 43.7290 us/op +WorkloadPilot 2: 3 op, 51291.00 ns, 17.0970 us/op +WorkloadPilot 3: 4 op, 56708.00 ns, 14.1770 us/op +WorkloadPilot 4: 5 op, 66875.00 ns, 13.3750 us/op +WorkloadPilot 5: 6 op, 78416.00 ns, 13.0693 us/op +WorkloadPilot 6: 7 op, 115334.00 ns, 16.4763 us/op +WorkloadPilot 7: 8 op, 114416.00 ns, 14.3020 us/op +WorkloadPilot 8: 9 op, 153250.00 ns, 17.0278 us/op +WorkloadPilot 9: 10 op, 133458.00 ns, 13.3458 us/op +WorkloadPilot 10: 11 op, 151041.00 ns, 13.7310 us/op +WorkloadPilot 11: 12 op, 154708.00 ns, 12.8923 us/op +WorkloadPilot 12: 13 op, 167916.00 ns, 12.9166 us/op +WorkloadPilot 13: 14 op, 176875.00 ns, 12.6339 us/op +WorkloadPilot 14: 15 op, 188166.00 ns, 12.5444 us/op +WorkloadPilot 15: 16 op, 200500.00 ns, 12.5313 us/op +WorkloadPilot 16: 32 op, 436375.00 ns, 13.6367 us/op +WorkloadPilot 17: 64 op, 797250.00 ns, 12.4570 us/op +WorkloadPilot 18: 128 op, 1601792.00 ns, 12.5140 us/op +WorkloadPilot 19: 256 op, 3326041.00 ns, 12.9923 us/op +WorkloadPilot 20: 512 op, 6477625.00 ns, 12.6516 us/op +WorkloadPilot 21: 1024 op, 13946375.00 ns, 13.6195 us/op +WorkloadPilot 22: 2048 op, 26378375.00 ns, 12.8801 us/op +WorkloadPilot 23: 4096 op, 50530417.00 ns, 12.3365 us/op +WorkloadPilot 24: 8192 op, 102673250.00 ns, 12.5334 us/op +WorkloadPilot 25: 16384 op, 229642417.00 ns, 14.0163 us/op +WorkloadPilot 26: 32768 op, 415983792.00 ns, 12.6948 us/op +WorkloadPilot 27: 65536 op, 338675667.00 ns, 5.1678 us/op +WorkloadPilot 28: 131072 op, 458758542.00 ns, 3.5000 us/op +WorkloadPilot 29: 262144 op, 914807000.00 ns, 3.4897 us/op + +WorkloadWarmup 1: 262144 op, 919138083.00 ns, 3.5062 us/op +WorkloadWarmup 2: 262144 op, 919837875.00 ns, 3.5089 us/op +WorkloadWarmup 3: 262144 op, 918837666.00 ns, 3.5051 us/op + +// BeforeActualRun +WorkloadActual 1: 262144 op, 915990667.00 ns, 3.4942 us/op +WorkloadActual 2: 262144 op, 917348750.00 ns, 3.4994 us/op +WorkloadActual 3: 262144 op, 913757791.00 ns, 3.4857 us/op +WorkloadActual 4: 262144 op, 917689583.00 ns, 3.5007 us/op +WorkloadActual 5: 262144 op, 912246458.00 ns, 3.4799 us/op +WorkloadActual 6: 262144 op, 914790208.00 ns, 3.4896 us/op +WorkloadActual 7: 262144 op, 917218541.00 ns, 3.4989 us/op +WorkloadActual 8: 262144 op, 917015875.00 ns, 3.4981 us/op +WorkloadActual 9: 262144 op, 914672417.00 ns, 3.4892 us/op +WorkloadActual 10: 262144 op, 920894584.00 ns, 3.5129 us/op + +// AfterActualRun +WorkloadResult 1: 262144 op, 915990667.00 ns, 3.4942 us/op +WorkloadResult 2: 262144 op, 917348750.00 ns, 3.4994 us/op +WorkloadResult 3: 262144 op, 913757791.00 ns, 3.4857 us/op +WorkloadResult 4: 262144 op, 917689583.00 ns, 3.5007 us/op +WorkloadResult 5: 262144 op, 912246458.00 ns, 3.4799 us/op +WorkloadResult 6: 262144 op, 914790208.00 ns, 3.4896 us/op +WorkloadResult 7: 262144 op, 917218541.00 ns, 3.4989 us/op +WorkloadResult 8: 262144 op, 917015875.00 ns, 3.4981 us/op +WorkloadResult 9: 262144 op, 914672417.00 ns, 3.4892 us/op +WorkloadResult 10: 262144 op, 920894584.00 ns, 3.5129 us/op +// GC: 303 3 0 1902237104 262144 +// Threading: 0 0 262144 + +// AfterAll +// Benchmark Process 9701 has exited with code 0. + +Mean = 3.495 μs, StdErr = 0.003 μs (0.08%), N = 10, StdDev = 0.009 μs +Min = 3.480 μs, Q1 = 3.489 μs, Median = 3.496 μs, Q3 = 3.499 μs, Max = 3.513 μs +IQR = 0.010 μs, LowerFence = 3.474 μs, UpperFence = 3.514 μs +ConfidenceInterval = [3.481 μs; 3.509 μs] (CI 99.9%), Margin = 0.014 μs (0.40% of Mean) +Skewness = 0.23, Kurtosis = 2.25, MValue = 2 + +// ** Remained 7 (70,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 1m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_MediumJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 3 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-XIHKWJ(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 180042.00 ns, 180.0420 us/op +2026-01-13 18:48:11.922 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 39917500.00 ns, 39.9175 ms/op + +WorkloadPilot 1: 2 op, 122791.00 ns, 61.3955 us/op +WorkloadPilot 2: 3 op, 58333.00 ns, 19.4443 us/op +WorkloadPilot 3: 4 op, 61792.00 ns, 15.4480 us/op +WorkloadPilot 4: 5 op, 72250.00 ns, 14.4500 us/op +WorkloadPilot 5: 6 op, 110000.00 ns, 18.3333 us/op +WorkloadPilot 6: 7 op, 110209.00 ns, 15.7441 us/op +WorkloadPilot 7: 8 op, 111375.00 ns, 13.9219 us/op +WorkloadPilot 8: 9 op, 159959.00 ns, 17.7732 us/op +WorkloadPilot 9: 10 op, 144917.00 ns, 14.4917 us/op +WorkloadPilot 10: 11 op, 150208.00 ns, 13.6553 us/op +WorkloadPilot 11: 12 op, 158334.00 ns, 13.1945 us/op +WorkloadPilot 12: 13 op, 169166.00 ns, 13.0128 us/op +WorkloadPilot 13: 14 op, 182166.00 ns, 13.0119 us/op +WorkloadPilot 14: 15 op, 193750.00 ns, 12.9167 us/op +WorkloadPilot 15: 16 op, 205916.00 ns, 12.8698 us/op +WorkloadPilot 16: 32 op, 404208.00 ns, 12.6315 us/op +WorkloadPilot 17: 64 op, 820625.00 ns, 12.8223 us/op +WorkloadPilot 18: 128 op, 1708000.00 ns, 13.3438 us/op +WorkloadPilot 19: 256 op, 3409541.00 ns, 13.3185 us/op +WorkloadPilot 20: 512 op, 6859500.00 ns, 13.3975 us/op +WorkloadPilot 21: 1024 op, 14327417.00 ns, 13.9916 us/op +WorkloadPilot 22: 2048 op, 27535500.00 ns, 13.4451 us/op +WorkloadPilot 23: 4096 op, 52365708.00 ns, 12.7846 us/op +WorkloadPilot 24: 8192 op, 122427125.00 ns, 14.9447 us/op +WorkloadPilot 25: 16384 op, 232087542.00 ns, 14.1655 us/op +WorkloadPilot 26: 32768 op, 387996542.00 ns, 11.8407 us/op +WorkloadPilot 27: 65536 op, 271095583.00 ns, 4.1366 us/op +WorkloadPilot 28: 131072 op, 465416334.00 ns, 3.5508 us/op +WorkloadPilot 29: 262144 op, 925723500.00 ns, 3.5314 us/op + +WorkloadWarmup 1: 262144 op, 931829250.00 ns, 3.5546 us/op +WorkloadWarmup 2: 262144 op, 927540459.00 ns, 3.5383 us/op +WorkloadWarmup 3: 262144 op, 930144750.00 ns, 3.5482 us/op + +// BeforeActualRun +WorkloadActual 1: 262144 op, 924927750.00 ns, 3.5283 us/op +WorkloadActual 2: 262144 op, 938538916.00 ns, 3.5802 us/op +WorkloadActual 3: 262144 op, 924031458.00 ns, 3.5249 us/op +WorkloadActual 4: 262144 op, 929952500.00 ns, 3.5475 us/op +WorkloadActual 5: 262144 op, 924259208.00 ns, 3.5258 us/op +WorkloadActual 6: 262144 op, 928040875.00 ns, 3.5402 us/op +WorkloadActual 7: 262144 op, 925738625.00 ns, 3.5314 us/op +WorkloadActual 8: 262144 op, 929247583.00 ns, 3.5448 us/op +WorkloadActual 9: 262144 op, 923100125.00 ns, 3.5213 us/op +WorkloadActual 10: 262144 op, 926895125.00 ns, 3.5358 us/op + +// AfterActualRun +WorkloadResult 1: 262144 op, 924927750.00 ns, 3.5283 us/op +WorkloadResult 2: 262144 op, 924031458.00 ns, 3.5249 us/op +WorkloadResult 3: 262144 op, 929952500.00 ns, 3.5475 us/op +WorkloadResult 4: 262144 op, 924259208.00 ns, 3.5258 us/op +WorkloadResult 5: 262144 op, 928040875.00 ns, 3.5402 us/op +WorkloadResult 6: 262144 op, 925738625.00 ns, 3.5314 us/op +WorkloadResult 7: 262144 op, 929247583.00 ns, 3.5448 us/op +WorkloadResult 8: 262144 op, 923100125.00 ns, 3.5213 us/op +WorkloadResult 9: 262144 op, 926895125.00 ns, 3.5358 us/op +// GC: 303 3 0 1902237104 262144 +// Threading: 0 0 262144 + +// AfterAll +// Benchmark Process 9703 has exited with code 0. + +Mean = 3.533 μs, StdErr = 0.003 μs (0.09%), N = 9, StdDev = 0.009 μs +Min = 3.521 μs, Q1 = 3.526 μs, Median = 3.531 μs, Q3 = 3.540 μs, Max = 3.547 μs +IQR = 0.014 μs, LowerFence = 3.504 μs, UpperFence = 3.562 μs +ConfidenceInterval = [3.518 μs; 3.549 μs] (CI 99.9%), Margin = 0.016 μs (0.44% of Mean) +Skewness = 0.25, Kurtosis = 1.35, MValue = 2 + +// ** Remained 6 (60,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 1m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_LargeJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 4 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-PUPMPI(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 188792.00 ns, 188.7920 us/op +2026-01-13 18:48:27.686 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 39946833.00 ns, 39.9468 ms/op + +WorkloadPilot 1: 2 op, 511625.00 ns, 255.8125 us/op +WorkloadPilot 2: 3 op, 581125.00 ns, 193.7083 us/op +WorkloadPilot 3: 4 op, 756042.00 ns, 189.0105 us/op +WorkloadPilot 4: 5 op, 932292.00 ns, 186.4584 us/op +WorkloadPilot 5: 6 op, 1099792.00 ns, 183.2987 us/op +WorkloadPilot 6: 7 op, 1323916.00 ns, 189.1309 us/op +WorkloadPilot 7: 8 op, 1613292.00 ns, 201.6615 us/op +WorkloadPilot 8: 9 op, 1797209.00 ns, 199.6899 us/op +WorkloadPilot 9: 10 op, 1970708.00 ns, 197.0708 us/op +WorkloadPilot 10: 11 op, 2315875.00 ns, 210.5341 us/op +WorkloadPilot 11: 12 op, 2354041.00 ns, 196.1701 us/op +WorkloadPilot 12: 13 op, 2608542.00 ns, 200.6571 us/op +WorkloadPilot 13: 14 op, 2681042.00 ns, 191.5030 us/op +WorkloadPilot 14: 15 op, 2812042.00 ns, 187.4695 us/op +WorkloadPilot 15: 16 op, 3103958.00 ns, 193.9974 us/op +WorkloadPilot 16: 32 op, 6291667.00 ns, 196.6146 us/op +WorkloadPilot 17: 64 op, 12999625.00 ns, 203.1191 us/op +WorkloadPilot 18: 128 op, 24825250.00 ns, 193.9473 us/op +WorkloadPilot 19: 256 op, 47500958.00 ns, 185.5506 us/op +WorkloadPilot 20: 512 op, 91660667.00 ns, 179.0247 us/op +WorkloadPilot 21: 1024 op, 180569541.00 ns, 176.3374 us/op +WorkloadPilot 22: 2048 op, 231153834.00 ns, 112.8681 us/op +WorkloadPilot 23: 4096 op, 347445792.00 ns, 84.8256 us/op +WorkloadPilot 24: 8192 op, 465485792.00 ns, 56.8220 us/op +WorkloadPilot 25: 16384 op, 931535458.00 ns, 56.8564 us/op + +WorkloadWarmup 1: 16384 op, 937714500.00 ns, 57.2336 us/op +WorkloadWarmup 2: 16384 op, 931176416.00 ns, 56.8345 us/op +WorkloadWarmup 3: 16384 op, 937228416.00 ns, 57.2039 us/op + +// BeforeActualRun +WorkloadActual 1: 16384 op, 929004208.00 ns, 56.7019 us/op +WorkloadActual 2: 16384 op, 931512250.00 ns, 56.8550 us/op +WorkloadActual 3: 16384 op, 936435000.00 ns, 57.1555 us/op +WorkloadActual 4: 16384 op, 928940875.00 ns, 56.6981 us/op +WorkloadActual 5: 16384 op, 931523542.00 ns, 56.8557 us/op +WorkloadActual 6: 16384 op, 938495834.00 ns, 57.2812 us/op +WorkloadActual 7: 16384 op, 924774166.00 ns, 56.4437 us/op +WorkloadActual 8: 16384 op, 932736833.00 ns, 56.9297 us/op +WorkloadActual 9: 16384 op, 932564042.00 ns, 56.9192 us/op +WorkloadActual 10: 16384 op, 929721333.00 ns, 56.7457 us/op + +// AfterActualRun +WorkloadResult 1: 16384 op, 929004208.00 ns, 56.7019 us/op +WorkloadResult 2: 16384 op, 931512250.00 ns, 56.8550 us/op +WorkloadResult 3: 16384 op, 936435000.00 ns, 57.1555 us/op +WorkloadResult 4: 16384 op, 928940875.00 ns, 56.6981 us/op +WorkloadResult 5: 16384 op, 931523542.00 ns, 56.8557 us/op +WorkloadResult 6: 16384 op, 924774166.00 ns, 56.4437 us/op +WorkloadResult 7: 16384 op, 932736833.00 ns, 56.9297 us/op +WorkloadResult 8: 16384 op, 932564042.00 ns, 56.9192 us/op +WorkloadResult 9: 16384 op, 929721333.00 ns, 56.7457 us/op +// GC: 341 85 0 2147749856 16384 +// Threading: 0 0 16384 + +// AfterAll +// Benchmark Process 9704 has exited with code 0. + +Mean = 56.812 μs, StdErr = 0.066 μs (0.12%), N = 9, StdDev = 0.198 μs +Min = 56.444 μs, Q1 = 56.702 μs, Median = 56.855 μs, Q3 = 56.919 μs, Max = 57.155 μs +IQR = 0.217 μs, LowerFence = 56.376 μs, UpperFence = 57.245 μs +ConfidenceInterval = [56.480 μs; 57.144 μs] (CI 99.9%), Margin = 0.332 μs (0.58% of Mean) +Skewness = -0.13, Kurtosis = 2.4, MValue = 2 + +// ** Remained 5 (50,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 1m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_LargeJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 5 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-IPDXQY(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 173375.00 ns, 173.3750 us/op +2026-01-13 18:48:43.359 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 39434167.00 ns, 39.4342 ms/op + +WorkloadPilot 1: 2 op, 480750.00 ns, 240.3750 us/op +WorkloadPilot 2: 3 op, 577958.00 ns, 192.6527 us/op +WorkloadPilot 3: 4 op, 757625.00 ns, 189.4063 us/op +WorkloadPilot 4: 5 op, 940792.00 ns, 188.1584 us/op +WorkloadPilot 5: 6 op, 1154417.00 ns, 192.4028 us/op +WorkloadPilot 6: 7 op, 1380083.00 ns, 197.1547 us/op +WorkloadPilot 7: 8 op, 1667083.00 ns, 208.3854 us/op +WorkloadPilot 8: 9 op, 1714583.00 ns, 190.5092 us/op +WorkloadPilot 9: 10 op, 1939000.00 ns, 193.9000 us/op +WorkloadPilot 10: 11 op, 2097375.00 ns, 190.6705 us/op +WorkloadPilot 11: 12 op, 2283875.00 ns, 190.3229 us/op +WorkloadPilot 12: 13 op, 2546166.00 ns, 195.8589 us/op +WorkloadPilot 13: 14 op, 2749000.00 ns, 196.3571 us/op +WorkloadPilot 14: 15 op, 2828708.00 ns, 188.5805 us/op +WorkloadPilot 15: 16 op, 3112375.00 ns, 194.5234 us/op +WorkloadPilot 16: 32 op, 6020834.00 ns, 188.1511 us/op +WorkloadPilot 17: 64 op, 12940583.00 ns, 202.1966 us/op +WorkloadPilot 18: 128 op, 24653333.00 ns, 192.6042 us/op +WorkloadPilot 19: 256 op, 48092375.00 ns, 187.8608 us/op +WorkloadPilot 20: 512 op, 102022834.00 ns, 199.2633 us/op +WorkloadPilot 21: 1024 op, 177939125.00 ns, 173.7687 us/op +WorkloadPilot 22: 2048 op, 272160917.00 ns, 132.8911 us/op +WorkloadPilot 23: 4096 op, 368221166.00 ns, 89.8977 us/op +WorkloadPilot 24: 8192 op, 474428542.00 ns, 57.9136 us/op +WorkloadPilot 25: 16384 op, 938160792.00 ns, 57.2608 us/op + +WorkloadWarmup 1: 16384 op, 932141917.00 ns, 56.8934 us/op +WorkloadWarmup 2: 16384 op, 933952875.00 ns, 57.0040 us/op +WorkloadWarmup 3: 16384 op, 940216000.00 ns, 57.3862 us/op + +// BeforeActualRun +WorkloadActual 1: 16384 op, 933144292.00 ns, 56.9546 us/op +WorkloadActual 2: 16384 op, 935062042.00 ns, 57.0717 us/op +WorkloadActual 3: 16384 op, 930412500.00 ns, 56.7879 us/op +WorkloadActual 4: 16384 op, 931647625.00 ns, 56.8633 us/op +WorkloadActual 5: 16384 op, 931371333.00 ns, 56.8464 us/op +WorkloadActual 6: 16384 op, 934799084.00 ns, 57.0556 us/op +WorkloadActual 7: 16384 op, 930934125.00 ns, 56.8197 us/op +WorkloadActual 8: 16384 op, 938937542.00 ns, 57.3082 us/op +WorkloadActual 9: 16384 op, 926522333.00 ns, 56.5504 us/op +WorkloadActual 10: 16384 op, 935950958.00 ns, 57.1259 us/op + +// AfterActualRun +WorkloadResult 1: 16384 op, 933144292.00 ns, 56.9546 us/op +WorkloadResult 2: 16384 op, 935062042.00 ns, 57.0717 us/op +WorkloadResult 3: 16384 op, 930412500.00 ns, 56.7879 us/op +WorkloadResult 4: 16384 op, 931647625.00 ns, 56.8633 us/op +WorkloadResult 5: 16384 op, 931371333.00 ns, 56.8464 us/op +WorkloadResult 6: 16384 op, 934799084.00 ns, 57.0556 us/op +WorkloadResult 7: 16384 op, 930934125.00 ns, 56.8197 us/op +WorkloadResult 8: 16384 op, 938937542.00 ns, 57.3082 us/op +WorkloadResult 9: 16384 op, 926522333.00 ns, 56.5504 us/op +WorkloadResult 10: 16384 op, 935950958.00 ns, 57.1259 us/op +// GC: 341 85 0 2147749856 16384 +// Threading: 0 0 16384 + +// AfterAll +// Benchmark Process 9707 has exited with code 0. + +Mean = 56.938 μs, StdErr = 0.067 μs (0.12%), N = 10, StdDev = 0.212 μs +Min = 56.550 μs, Q1 = 56.826 μs, Median = 56.909 μs, Q3 = 57.068 μs, Max = 57.308 μs +IQR = 0.241 μs, LowerFence = 56.464 μs, UpperFence = 57.430 μs +ConfidenceInterval = [56.618 μs; 57.259 μs] (CI 99.9%), Margin = 0.321 μs (0.56% of Mean) +Skewness = -0.04, Kurtosis = 2.17, MValue = 2 + +// ** Remained 4 (40,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 0m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_Base64 --job "IterationCount=10, WarmupCount=3" --benchmarkId 6 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-EDMQTQ(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 225625.00 ns, 225.6250 us/op +2026-01-13 18:48:59.138 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 41669708.00 ns, 41.6697 ms/op + +WorkloadPilot 1: 2 op, 125250.00 ns, 62.6250 us/op +WorkloadPilot 2: 3 op, 39333.00 ns, 13.1110 us/op +WorkloadPilot 3: 4 op, 40834.00 ns, 10.2085 us/op +WorkloadPilot 4: 5 op, 47250.00 ns, 9.4500 us/op +WorkloadPilot 5: 6 op, 55000.00 ns, 9.1667 us/op +WorkloadPilot 6: 7 op, 62167.00 ns, 8.8810 us/op +WorkloadPilot 7: 8 op, 69666.00 ns, 8.7083 us/op +WorkloadPilot 8: 9 op, 77833.00 ns, 8.6481 us/op +WorkloadPilot 9: 10 op, 87041.00 ns, 8.7041 us/op +WorkloadPilot 10: 11 op, 125792.00 ns, 11.4356 us/op +WorkloadPilot 11: 12 op, 164209.00 ns, 13.6841 us/op +WorkloadPilot 12: 13 op, 128625.00 ns, 9.8942 us/op +WorkloadPilot 13: 14 op, 124375.00 ns, 8.8839 us/op +WorkloadPilot 14: 15 op, 125333.00 ns, 8.3555 us/op +WorkloadPilot 15: 16 op, 130916.00 ns, 8.1823 us/op +WorkloadPilot 16: 32 op, 252000.00 ns, 7.8750 us/op +WorkloadPilot 17: 64 op, 492541.00 ns, 7.6960 us/op +WorkloadPilot 18: 128 op, 976167.00 ns, 7.6263 us/op +WorkloadPilot 19: 256 op, 2136625.00 ns, 8.3462 us/op +WorkloadPilot 20: 512 op, 4323541.00 ns, 8.4444 us/op +WorkloadPilot 21: 1024 op, 8766625.00 ns, 8.5612 us/op +WorkloadPilot 22: 2048 op, 17339834.00 ns, 8.4667 us/op +WorkloadPilot 23: 4096 op, 32308667.00 ns, 7.8879 us/op +WorkloadPilot 24: 8192 op, 64980542.00 ns, 7.9322 us/op +WorkloadPilot 25: 16384 op, 141919625.00 ns, 8.6621 us/op +WorkloadPilot 26: 32768 op, 290863292.00 ns, 8.8764 us/op +WorkloadPilot 27: 65536 op, 250992375.00 ns, 3.8298 us/op +WorkloadPilot 28: 131072 op, 310992583.00 ns, 2.3727 us/op +WorkloadPilot 29: 262144 op, 621678208.00 ns, 2.3715 us/op + +WorkloadWarmup 1: 262144 op, 617181791.00 ns, 2.3544 us/op +WorkloadWarmup 2: 262144 op, 616309458.00 ns, 2.3510 us/op +WorkloadWarmup 3: 262144 op, 616954000.00 ns, 2.3535 us/op + +// BeforeActualRun +WorkloadActual 1: 262144 op, 617925292.00 ns, 2.3572 us/op +WorkloadActual 2: 262144 op, 617040125.00 ns, 2.3538 us/op +WorkloadActual 3: 262144 op, 615349709.00 ns, 2.3474 us/op +WorkloadActual 4: 262144 op, 615690791.00 ns, 2.3487 us/op +WorkloadActual 5: 262144 op, 620484125.00 ns, 2.3670 us/op +WorkloadActual 6: 262144 op, 623486917.00 ns, 2.3784 us/op +WorkloadActual 7: 262144 op, 615745167.00 ns, 2.3489 us/op +WorkloadActual 8: 262144 op, 618375333.00 ns, 2.3589 us/op +WorkloadActual 9: 262144 op, 619140542.00 ns, 2.3618 us/op +WorkloadActual 10: 262144 op, 615245625.00 ns, 2.3470 us/op + +// AfterActualRun +WorkloadResult 1: 262144 op, 617925292.00 ns, 2.3572 us/op +WorkloadResult 2: 262144 op, 617040125.00 ns, 2.3538 us/op +WorkloadResult 3: 262144 op, 615349709.00 ns, 2.3474 us/op +WorkloadResult 4: 262144 op, 615690791.00 ns, 2.3487 us/op +WorkloadResult 5: 262144 op, 620484125.00 ns, 2.3670 us/op +WorkloadResult 6: 262144 op, 623486917.00 ns, 2.3784 us/op +WorkloadResult 7: 262144 op, 615745167.00 ns, 2.3489 us/op +WorkloadResult 8: 262144 op, 618375333.00 ns, 2.3589 us/op +WorkloadResult 9: 262144 op, 619140542.00 ns, 2.3618 us/op +WorkloadResult 10: 262144 op, 615245625.00 ns, 2.3470 us/op +// GC: 188 2 0 1182868888 262144 +// Threading: 0 0 262144 + +// AfterAll +// Benchmark Process 9708 has exited with code 0. + +Mean = 2.357 μs, StdErr = 0.003 μs (0.14%), N = 10, StdDev = 0.010 μs +Min = 2.347 μs, Q1 = 2.349 μs, Median = 2.356 μs, Q3 = 2.361 μs, Max = 2.378 μs +IQR = 0.012 μs, LowerFence = 2.330 μs, UpperFence = 2.380 μs +ConfidenceInterval = [2.342 μs; 2.372 μs] (CI 99.9%), Margin = 0.015 μs (0.65% of Mean) +Skewness = 0.78, Kurtosis = 2.39, MValue = 2 + +// ** Remained 3 (30,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 0m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_Base64 --job "IterationCount=10, WarmupCount=3" --benchmarkId 7 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-HTOURQ(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 173541.00 ns, 173.5410 us/op +2026-01-13 18:49:09.800 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 40036250.00 ns, 40.0363 ms/op + +WorkloadPilot 1: 2 op, 110958.00 ns, 55.4790 us/op +WorkloadPilot 2: 3 op, 38792.00 ns, 12.9307 us/op +WorkloadPilot 3: 4 op, 58750.00 ns, 14.6875 us/op +WorkloadPilot 4: 5 op, 51250.00 ns, 10.2500 us/op +WorkloadPilot 5: 6 op, 58375.00 ns, 9.7292 us/op +WorkloadPilot 6: 7 op, 63791.00 ns, 9.1130 us/op +WorkloadPilot 7: 8 op, 97125.00 ns, 12.1406 us/op +WorkloadPilot 8: 9 op, 86250.00 ns, 9.5833 us/op +WorkloadPilot 9: 10 op, 99667.00 ns, 9.9667 us/op +WorkloadPilot 10: 11 op, 122875.00 ns, 11.1705 us/op +WorkloadPilot 11: 12 op, 138875.00 ns, 11.5729 us/op +WorkloadPilot 12: 13 op, 131000.00 ns, 10.0769 us/op +WorkloadPilot 13: 14 op, 121250.00 ns, 8.6607 us/op +WorkloadPilot 14: 15 op, 129833.00 ns, 8.6555 us/op +WorkloadPilot 15: 16 op, 137208.00 ns, 8.5755 us/op +WorkloadPilot 16: 32 op, 261292.00 ns, 8.1654 us/op +WorkloadPilot 17: 64 op, 519416.00 ns, 8.1159 us/op +WorkloadPilot 18: 128 op, 1016625.00 ns, 7.9424 us/op +WorkloadPilot 19: 256 op, 2090125.00 ns, 8.1646 us/op +WorkloadPilot 20: 512 op, 4411125.00 ns, 8.6155 us/op +WorkloadPilot 21: 1024 op, 9028125.00 ns, 8.8165 us/op +WorkloadPilot 22: 2048 op, 17894958.00 ns, 8.7378 us/op +WorkloadPilot 23: 4096 op, 34757792.00 ns, 8.4858 us/op +WorkloadPilot 24: 8192 op, 67096209.00 ns, 8.1905 us/op +WorkloadPilot 25: 16384 op, 152778250.00 ns, 9.3248 us/op +WorkloadPilot 26: 32768 op, 301104625.00 ns, 9.1890 us/op +WorkloadPilot 27: 65536 op, 236810875.00 ns, 3.6134 us/op +WorkloadPilot 28: 131072 op, 314258041.00 ns, 2.3976 us/op +WorkloadPilot 29: 262144 op, 632890459.00 ns, 2.4143 us/op + +WorkloadWarmup 1: 262144 op, 627463042.00 ns, 2.3936 us/op +WorkloadWarmup 2: 262144 op, 628258042.00 ns, 2.3966 us/op +WorkloadWarmup 3: 262144 op, 627575666.00 ns, 2.3940 us/op + +// BeforeActualRun +WorkloadActual 1: 262144 op, 628781209.00 ns, 2.3986 us/op +WorkloadActual 2: 262144 op, 628144417.00 ns, 2.3962 us/op +WorkloadActual 3: 262144 op, 633454417.00 ns, 2.4164 us/op +WorkloadActual 4: 262144 op, 627897125.00 ns, 2.3952 us/op +WorkloadActual 5: 262144 op, 627964208.00 ns, 2.3955 us/op +WorkloadActual 6: 262144 op, 627752833.00 ns, 2.3947 us/op +WorkloadActual 7: 262144 op, 626357125.00 ns, 2.3894 us/op +WorkloadActual 8: 262144 op, 627807875.00 ns, 2.3949 us/op +WorkloadActual 9: 262144 op, 627619542.00 ns, 2.3942 us/op +WorkloadActual 10: 262144 op, 625576917.00 ns, 2.3864 us/op + +// AfterActualRun +WorkloadResult 1: 262144 op, 628144417.00 ns, 2.3962 us/op +WorkloadResult 2: 262144 op, 627897125.00 ns, 2.3952 us/op +WorkloadResult 3: 262144 op, 627964208.00 ns, 2.3955 us/op +WorkloadResult 4: 262144 op, 627752833.00 ns, 2.3947 us/op +WorkloadResult 5: 262144 op, 626357125.00 ns, 2.3894 us/op +WorkloadResult 6: 262144 op, 627807875.00 ns, 2.3949 us/op +WorkloadResult 7: 262144 op, 627619542.00 ns, 2.3942 us/op +WorkloadResult 8: 262144 op, 625576917.00 ns, 2.3864 us/op +// GC: 188 2 0 1182868888 262144 +// Threading: 0 0 262144 + +// AfterAll +// Benchmark Process 9709 has exited with code 0. + +Mean = 2.393 μs, StdErr = 0.001 μs (0.05%), N = 8, StdDev = 0.003 μs +Min = 2.386 μs, Q1 = 2.393 μs, Median = 2.395 μs, Q3 = 2.395 μs, Max = 2.396 μs +IQR = 0.002 μs, LowerFence = 2.389 μs, UpperFence = 2.399 μs +ConfidenceInterval = [2.387 μs; 2.400 μs] (CI 99.9%), Margin = 0.007 μs (0.28% of Mean) +Skewness = -1.01, Kurtosis = 2.22, MValue = 2 + +// ** Remained 2 (20,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 0m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_Xml --job "IterationCount=10, WarmupCount=3" --benchmarkId 8 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-KYXJCG(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 210042.00 ns, 210.0420 us/op +2026-01-13 18:49:20.643 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 39814875.00 ns, 39.8149 ms/op + +WorkloadPilot 1: 2 op, 90916.00 ns, 45.4580 us/op +WorkloadPilot 2: 3 op, 39750.00 ns, 13.2500 us/op +WorkloadPilot 3: 4 op, 43000.00 ns, 10.7500 us/op +WorkloadPilot 4: 5 op, 49541.00 ns, 9.9082 us/op +WorkloadPilot 5: 6 op, 58167.00 ns, 9.6945 us/op +WorkloadPilot 6: 7 op, 65833.00 ns, 9.4047 us/op +WorkloadPilot 7: 8 op, 79750.00 ns, 9.9688 us/op +WorkloadPilot 8: 9 op, 87250.00 ns, 9.6944 us/op +WorkloadPilot 9: 10 op, 98042.00 ns, 9.8042 us/op +WorkloadPilot 10: 11 op, 106000.00 ns, 9.6364 us/op +WorkloadPilot 11: 12 op, 109667.00 ns, 9.1389 us/op +WorkloadPilot 12: 13 op, 118708.00 ns, 9.1314 us/op +WorkloadPilot 13: 14 op, 159292.00 ns, 11.3780 us/op +WorkloadPilot 14: 15 op, 164917.00 ns, 10.9945 us/op +WorkloadPilot 15: 16 op, 155542.00 ns, 9.7214 us/op +WorkloadPilot 16: 32 op, 298542.00 ns, 9.3294 us/op +WorkloadPilot 17: 64 op, 571625.00 ns, 8.9316 us/op +WorkloadPilot 18: 128 op, 1152333.00 ns, 9.0026 us/op +WorkloadPilot 19: 256 op, 2434083.00 ns, 9.5081 us/op +WorkloadPilot 20: 512 op, 4721459.00 ns, 9.2216 us/op +WorkloadPilot 21: 1024 op, 10097292.00 ns, 9.8606 us/op +WorkloadPilot 22: 2048 op, 18953542.00 ns, 9.2547 us/op +WorkloadPilot 23: 4096 op, 36126458.00 ns, 8.8199 us/op +WorkloadPilot 24: 8192 op, 73763208.00 ns, 9.0043 us/op +WorkloadPilot 25: 16384 op, 160575292.00 ns, 9.8007 us/op +WorkloadPilot 26: 32768 op, 328501667.00 ns, 10.0251 us/op +WorkloadPilot 27: 65536 op, 220564667.00 ns, 3.3655 us/op +WorkloadPilot 28: 131072 op, 332576333.00 ns, 2.5374 us/op +WorkloadPilot 29: 262144 op, 662809959.00 ns, 2.5284 us/op + +WorkloadWarmup 1: 262144 op, 662347875.00 ns, 2.5267 us/op +WorkloadWarmup 2: 262144 op, 662608708.00 ns, 2.5277 us/op +WorkloadWarmup 3: 262144 op, 663753458.00 ns, 2.5320 us/op + +// BeforeActualRun +WorkloadActual 1: 262144 op, 662248208.00 ns, 2.5263 us/op +WorkloadActual 2: 262144 op, 663888250.00 ns, 2.5325 us/op +WorkloadActual 3: 262144 op, 662090542.00 ns, 2.5257 us/op +WorkloadActual 4: 262144 op, 661262291.00 ns, 2.5225 us/op +WorkloadActual 5: 262144 op, 663405042.00 ns, 2.5307 us/op +WorkloadActual 6: 262144 op, 660995417.00 ns, 2.5215 us/op +WorkloadActual 7: 262144 op, 661632792.00 ns, 2.5239 us/op +WorkloadActual 8: 262144 op, 661587042.00 ns, 2.5238 us/op +WorkloadActual 9: 262144 op, 664613166.00 ns, 2.5353 us/op +WorkloadActual 10: 262144 op, 663312750.00 ns, 2.5303 us/op + +// AfterActualRun +WorkloadResult 1: 262144 op, 662248208.00 ns, 2.5263 us/op +WorkloadResult 2: 262144 op, 663888250.00 ns, 2.5325 us/op +WorkloadResult 3: 262144 op, 662090542.00 ns, 2.5257 us/op +WorkloadResult 4: 262144 op, 661262291.00 ns, 2.5225 us/op +WorkloadResult 5: 262144 op, 663405042.00 ns, 2.5307 us/op +WorkloadResult 6: 262144 op, 660995417.00 ns, 2.5215 us/op +WorkloadResult 7: 262144 op, 661632792.00 ns, 2.5239 us/op +WorkloadResult 8: 262144 op, 661587042.00 ns, 2.5238 us/op +WorkloadResult 9: 262144 op, 664613166.00 ns, 2.5353 us/op +WorkloadResult 10: 262144 op, 663312750.00 ns, 2.5303 us/op +// GC: 190 1 0 1193355432 262144 +// Threading: 0 0 262144 + +// AfterAll +// Benchmark Process 9712 has exited with code 0. + +Mean = 2.527 μs, StdErr = 0.001 μs (0.06%), N = 10, StdDev = 0.005 μs +Min = 2.521 μs, Q1 = 2.524 μs, Median = 2.526 μs, Q3 = 2.531 μs, Max = 2.535 μs +IQR = 0.007 μs, LowerFence = 2.514 μs, UpperFence = 2.541 μs +ConfidenceInterval = [2.520 μs; 2.534 μs] (CI 99.9%), Margin = 0.007 μs (0.28% of Mean) +Skewness = 0.35, Kurtosis = 1.49, MValue = 2 + +// ** Remained 1 (10,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 0m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_Xml --job "IterationCount=10, WarmupCount=3" --benchmarkId 9 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-INQKNJ(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 193708.00 ns, 193.7080 us/op +2026-01-13 18:49:32.039 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 40245959.00 ns, 40.2460 ms/op + +WorkloadPilot 1: 2 op, 115834.00 ns, 57.9170 us/op +WorkloadPilot 2: 3 op, 48208.00 ns, 16.0693 us/op +WorkloadPilot 3: 4 op, 62667.00 ns, 15.6668 us/op +WorkloadPilot 4: 5 op, 122167.00 ns, 24.4334 us/op +WorkloadPilot 5: 6 op, 100709.00 ns, 16.7848 us/op +WorkloadPilot 6: 7 op, 122625.00 ns, 17.5179 us/op +WorkloadPilot 7: 8 op, 98625.00 ns, 12.3281 us/op +WorkloadPilot 8: 9 op, 105792.00 ns, 11.7547 us/op +WorkloadPilot 9: 10 op, 100416.00 ns, 10.0416 us/op +WorkloadPilot 10: 11 op, 115375.00 ns, 10.4886 us/op +WorkloadPilot 11: 12 op, 136250.00 ns, 11.3542 us/op +WorkloadPilot 12: 13 op, 126916.00 ns, 9.7628 us/op +WorkloadPilot 13: 14 op, 129833.00 ns, 9.2738 us/op +WorkloadPilot 14: 15 op, 156291.00 ns, 10.4194 us/op +WorkloadPilot 15: 16 op, 147625.00 ns, 9.2266 us/op +WorkloadPilot 16: 32 op, 287958.00 ns, 8.9987 us/op +WorkloadPilot 17: 64 op, 597625.00 ns, 9.3379 us/op +WorkloadPilot 18: 128 op, 1191166.00 ns, 9.3060 us/op +WorkloadPilot 19: 256 op, 2472208.00 ns, 9.6571 us/op +WorkloadPilot 20: 512 op, 4766166.00 ns, 9.3089 us/op +WorkloadPilot 21: 1024 op, 10104667.00 ns, 9.8678 us/op +WorkloadPilot 22: 2048 op, 19633875.00 ns, 9.5869 us/op +WorkloadPilot 23: 4096 op, 37341042.00 ns, 9.1165 us/op +WorkloadPilot 24: 8192 op, 77510083.00 ns, 9.4617 us/op +WorkloadPilot 25: 16384 op, 168054875.00 ns, 10.2573 us/op +WorkloadPilot 26: 32768 op, 326036084.00 ns, 9.9498 us/op +WorkloadPilot 27: 65536 op, 221216208.00 ns, 3.3755 us/op +WorkloadPilot 28: 131072 op, 336066625.00 ns, 2.5640 us/op +WorkloadPilot 29: 262144 op, 671116250.00 ns, 2.5601 us/op + +WorkloadWarmup 1: 262144 op, 670766375.00 ns, 2.5588 us/op +WorkloadWarmup 2: 262144 op, 669126042.00 ns, 2.5525 us/op +WorkloadWarmup 3: 262144 op, 671969500.00 ns, 2.5634 us/op + +// BeforeActualRun +WorkloadActual 1: 262144 op, 670443375.00 ns, 2.5575 us/op +WorkloadActual 2: 262144 op, 670706333.00 ns, 2.5585 us/op +WorkloadActual 3: 262144 op, 671379583.00 ns, 2.5611 us/op +WorkloadActual 4: 262144 op, 699001375.00 ns, 2.6665 us/op +WorkloadActual 5: 262144 op, 721573292.00 ns, 2.7526 us/op +WorkloadActual 6: 262144 op, 672450583.00 ns, 2.5652 us/op +WorkloadActual 7: 262144 op, 674026708.00 ns, 2.5712 us/op +WorkloadActual 8: 262144 op, 684076000.00 ns, 2.6095 us/op +WorkloadActual 9: 262144 op, 674778333.00 ns, 2.5741 us/op +WorkloadActual 10: 262144 op, 669776250.00 ns, 2.5550 us/op + +// AfterActualRun +WorkloadResult 1: 262144 op, 670443375.00 ns, 2.5575 us/op +WorkloadResult 2: 262144 op, 670706333.00 ns, 2.5585 us/op +WorkloadResult 3: 262144 op, 671379583.00 ns, 2.5611 us/op +WorkloadResult 4: 262144 op, 672450583.00 ns, 2.5652 us/op +WorkloadResult 5: 262144 op, 674026708.00 ns, 2.5712 us/op +WorkloadResult 6: 262144 op, 684076000.00 ns, 2.6095 us/op +WorkloadResult 7: 262144 op, 674778333.00 ns, 2.5741 us/op +WorkloadResult 8: 262144 op, 669776250.00 ns, 2.5550 us/op +// GC: 190 1 0 1193355432 262144 +// Threading: 0 0 262144 + +// AfterAll +// Benchmark Process 9718 has exited with code 0. + +Mean = 2.569 μs, StdErr = 0.006 μs (0.24%), N = 8, StdDev = 0.018 μs +Min = 2.555 μs, Q1 = 2.558 μs, Median = 2.563 μs, Q3 = 2.572 μs, Max = 2.610 μs +IQR = 0.014 μs, LowerFence = 2.538 μs, UpperFence = 2.592 μs +ConfidenceInterval = [2.535 μs; 2.603 μs] (CI 99.9%), Margin = 0.034 μs (1.32% of Mean) +Skewness = 1.37, Kurtosis = 3.54, MValue = 2 + +// ** Remained 0 (0,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report.html + +// * Detailed results * +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 1.991 μs, StdErr = 0.001 μs (0.06%), N = 8, StdDev = 0.004 μs +Min = 1.985 μs, Q1 = 1.988 μs, Median = 1.992 μs, Q3 = 1.993 μs, Max = 1.995 μs +IQR = 0.005 μs, LowerFence = 1.980 μs, UpperFence = 2.001 μs +ConfidenceInterval = [1.984 μs; 1.998 μs] (CI 99.9%), Margin = 0.007 μs (0.35% of Mean) +Skewness = -0.28, Kurtosis = 1.38, MValue = 2 +-------------------- Histogram -------------------- +[1.983 μs ; 1.998 μs) | @@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 2.041 μs, StdErr = 0.001 μs (0.05%), N = 8, StdDev = 0.003 μs +Min = 2.037 μs, Q1 = 2.040 μs, Median = 2.040 μs, Q3 = 2.042 μs, Max = 2.046 μs +IQR = 0.002 μs, LowerFence = 2.036 μs, UpperFence = 2.045 μs +ConfidenceInterval = [2.036 μs; 2.046 μs] (CI 99.9%), Margin = 0.005 μs (0.26% of Mean) +Skewness = 0.59, Kurtosis = 1.93, MValue = 2 +-------------------- Histogram -------------------- +[2.036 μs ; 2.048 μs) | @@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 3.495 μs, StdErr = 0.003 μs (0.08%), N = 10, StdDev = 0.009 μs +Min = 3.480 μs, Q1 = 3.489 μs, Median = 3.496 μs, Q3 = 3.499 μs, Max = 3.513 μs +IQR = 0.010 μs, LowerFence = 3.474 μs, UpperFence = 3.514 μs +ConfidenceInterval = [3.481 μs; 3.509 μs] (CI 99.9%), Margin = 0.014 μs (0.40% of Mean) +Skewness = 0.23, Kurtosis = 2.25, MValue = 2 +-------------------- Histogram -------------------- +[3.474 μs ; 3.519 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 3.533 μs, StdErr = 0.003 μs (0.09%), N = 9, StdDev = 0.009 μs +Min = 3.521 μs, Q1 = 3.526 μs, Median = 3.531 μs, Q3 = 3.540 μs, Max = 3.547 μs +IQR = 0.014 μs, LowerFence = 3.504 μs, UpperFence = 3.562 μs +ConfidenceInterval = [3.518 μs; 3.549 μs] (CI 99.9%), Margin = 0.016 μs (0.44% of Mean) +Skewness = 0.25, Kurtosis = 1.35, MValue = 2 +-------------------- Histogram -------------------- +[3.516 μs ; 3.553 μs) | @@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 56.812 μs, StdErr = 0.066 μs (0.12%), N = 9, StdDev = 0.198 μs +Min = 56.444 μs, Q1 = 56.702 μs, Median = 56.855 μs, Q3 = 56.919 μs, Max = 57.155 μs +IQR = 0.217 μs, LowerFence = 56.376 μs, UpperFence = 57.245 μs +ConfidenceInterval = [56.480 μs; 57.144 μs] (CI 99.9%), Margin = 0.332 μs (0.58% of Mean) +Skewness = -0.13, Kurtosis = 2.4, MValue = 2 +-------------------- Histogram -------------------- +[56.319 μs ; 57.280 μs) | @@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 56.938 μs, StdErr = 0.067 μs (0.12%), N = 10, StdDev = 0.212 μs +Min = 56.550 μs, Q1 = 56.826 μs, Median = 56.909 μs, Q3 = 57.068 μs, Max = 57.308 μs +IQR = 0.241 μs, LowerFence = 56.464 μs, UpperFence = 57.430 μs +ConfidenceInterval = [56.618 μs; 57.259 μs] (CI 99.9%), Margin = 0.321 μs (0.56% of Mean) +Skewness = -0.04, Kurtosis = 2.17, MValue = 2 +-------------------- Histogram -------------------- +[56.421 μs ; 57.437 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 2.357 μs, StdErr = 0.003 μs (0.14%), N = 10, StdDev = 0.010 μs +Min = 2.347 μs, Q1 = 2.349 μs, Median = 2.356 μs, Q3 = 2.361 μs, Max = 2.378 μs +IQR = 0.012 μs, LowerFence = 2.330 μs, UpperFence = 2.380 μs +ConfidenceInterval = [2.342 μs; 2.372 μs] (CI 99.9%), Margin = 0.015 μs (0.65% of Mean) +Skewness = 0.78, Kurtosis = 2.39, MValue = 2 +-------------------- Histogram -------------------- +[2.341 μs ; 2.385 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 2.393 μs, StdErr = 0.001 μs (0.05%), N = 8, StdDev = 0.003 μs +Min = 2.386 μs, Q1 = 2.393 μs, Median = 2.395 μs, Q3 = 2.395 μs, Max = 2.396 μs +IQR = 0.002 μs, LowerFence = 2.389 μs, UpperFence = 2.399 μs +ConfidenceInterval = [2.387 μs; 2.400 μs] (CI 99.9%), Margin = 0.007 μs (0.28% of Mean) +Skewness = -1.01, Kurtosis = 2.22, MValue = 2 +-------------------- Histogram -------------------- +[2.384 μs ; 2.398 μs) | @@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 2.527 μs, StdErr = 0.001 μs (0.06%), N = 10, StdDev = 0.005 μs +Min = 2.521 μs, Q1 = 2.524 μs, Median = 2.526 μs, Q3 = 2.531 μs, Max = 2.535 μs +IQR = 0.007 μs, LowerFence = 2.514 μs, UpperFence = 2.541 μs +ConfidenceInterval = [2.520 μs; 2.534 μs] (CI 99.9%), Margin = 0.007 μs (0.28% of Mean) +Skewness = 0.35, Kurtosis = 1.49, MValue = 2 +-------------------- Histogram -------------------- +[2.519 μs ; 2.538 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 2.569 μs, StdErr = 0.006 μs (0.24%), N = 8, StdDev = 0.018 μs +Min = 2.555 μs, Q1 = 2.558 μs, Median = 2.563 μs, Q3 = 2.572 μs, Max = 2.610 μs +IQR = 0.014 μs, LowerFence = 2.538 μs, UpperFence = 2.592 μs +ConfidenceInterval = [2.535 μs; 2.603 μs] (CI 99.9%), Margin = 0.034 μs (1.32% of Mean) +Skewness = 1.37, Kurtosis = 3.54, MValue = 2 +-------------------- Histogram -------------------- +[2.543 μs ; 2.621 μs) | @@@@@@@@ +--------------------------------------------------- + +// * Summary * + +BenchmarkDotNet v0.14.0, macOS 26.2 (25C56) [Darwin 25.2.0] +Apple M1 Ultra, 1 CPU, 20 logical and 20 physical cores +.NET SDK 10.0.101 + [Host] : .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD + Job-AHWFFF : .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD + +IterationCount=10 WarmupCount=3 + +| Method | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Gen1 | Allocated | Alloc Ratio | +|------------------------------------------ |----------:|----------:|----------:|------:|--------:|--------:|-------:|----------:|------------:| +| 'Permissive mode - Small JSON payload' | 1.991 μs | 0.0069 μs | 0.0036 μs | 0.77 | 0.01 | 0.6638 | 0.0038 | 4.08 KB | 0.92 | +| 'Strict mode - Small JSON payload' | 2.041 μs | 0.0053 μs | 0.0028 μs | 0.79 | 0.01 | 0.6638 | 0.0038 | 4.08 KB | 0.92 | +| 'Permissive mode - Medium JSON payload' | 3.495 μs | 0.0140 μs | 0.0093 μs | 1.36 | 0.01 | 1.1559 | 0.0114 | 7.09 KB | 1.59 | +| 'Strict mode - Medium JSON payload' | 3.533 μs | 0.0156 μs | 0.0093 μs | 1.38 | 0.01 | 1.1559 | 0.0114 | 7.09 KB | 1.59 | +| 'Permissive mode - Large JSON payload' | 56.812 μs | 0.3320 μs | 0.1975 μs | 22.11 | 0.16 | 20.8130 | 5.1880 | 128.02 KB | 28.80 | +| 'Strict mode - Large JSON payload' | 56.938 μs | 0.3207 μs | 0.2121 μs | 22.16 | 0.16 | 20.8130 | 5.1880 | 128.02 KB | 28.80 | +| 'Permissive mode - Base64 binary payload' | 2.357 μs | 0.0153 μs | 0.0101 μs | 0.92 | 0.01 | 0.7172 | 0.0076 | 4.41 KB | 0.99 | +| 'Strict mode - Base64 binary payload' | 2.393 μs | 0.0067 μs | 0.0035 μs | 0.93 | 0.01 | 0.7172 | 0.0076 | 4.41 KB | 0.99 | +| 'Permissive mode - XML payload' | 2.527 μs | 0.0071 μs | 0.0047 μs | 0.98 | 0.01 | 0.7248 | 0.0038 | 4.45 KB | 1.00 | +| 'Strict mode - XML payload' | 2.569 μs | 0.0338 μs | 0.0177 μs | 1.00 | 0.01 | 0.7248 | 0.0038 | 4.45 KB | 1.00 | + +// * Hints * +Outliers + CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': IterationCount=10, WarmupCount=3 -> 2 outliers were removed (2.01 μs, 2.03 μs) + CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': IterationCount=10, WarmupCount=3 -> 2 outliers were removed (2.06 μs, 2.07 μs) + CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': IterationCount=10, WarmupCount=3 -> 1 outlier was removed (3.58 μs) + CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': IterationCount=10, WarmupCount=3 -> 1 outlier was removed (57.28 μs) + CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': IterationCount=10, WarmupCount=3 -> 2 outliers were removed, 4 outliers were detected (2.39 μs, 2.39 μs, 2.40 μs, 2.42 μs) + CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': IterationCount=10, WarmupCount=3 -> 2 outliers were removed (2.67 μs, 2.75 μs) + +// * Legends * + Mean : Arithmetic mean of all measurements + Error : Half of 99.9% confidence interval + StdDev : Standard deviation of all measurements + Ratio : Mean of the ratio distribution ([Current]/[Baseline]) + RatioSD : Standard deviation of the ratio distribution ([Current]/[Baseline]) + Gen0 : GC Generation 0 collects per 1000 operations + Gen1 : GC Generation 1 collects per 1000 operations + Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B) + Alloc Ratio : Allocated memory ratio distribution ([Current]/[Baseline]) + 1 μs : 1 Microsecond (0.000001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:02:06 (126.01 sec), executed benchmarks: 10 + +Global total time: 00:02:15 (135.01 sec), executed benchmarks: 10 +// * Artifacts cleanup * +Artifacts cleanup is finished From d72baf9305e3cd1516d2b37ee49e7d870c320e64 Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Tue, 13 Jan 2026 21:12:31 +0100 Subject: [PATCH 07/21] Remove not needed tests --- .../When_amqp_binary_message_received.cs | 120 ------------------ .../When_http_binary_message_received.cs | 120 ------------------ 2 files changed, 240 deletions(-) delete mode 100644 src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs delete mode 100644 src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs deleted file mode 100644 index 0888c6f..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs +++ /dev/null @@ -1,120 +0,0 @@ -namespace NServiceBus.Envelope.CloudEvents.AcceptanceTests.CloudEvents; - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using AcceptanceTesting; -using Configuration.AdvancedExtensibility; -using NServiceBus.AcceptanceTests; -using NServiceBus.AcceptanceTests.EndpointTemplates; -using Pipeline; -using Transport; -using NUnit.Framework; - -public class When_amqp_binary_message_received : NServiceBusAcceptanceTest -{ - [Test] - public async Task An_amqp_binary_cloud_event_is_received() - { - var context = await Scenario.Define() - .WithEndpoint(g => g.When(b => - { - // The following represents a CloudEvent that Azure Blob Storage generates - // to notify that a new blob item has been created. - // Azure sends CloudEvents as JSON Structured. Below is the equivalent - // in the AMQP Binary format. - // The headers are set in the CustomSerializationBehavior. - return b.SendLocal(new Message() - { - Api = "PutBlockList", - ClientRequestId = "4c5dd7fb-2c48-4a27-bb30-5361b5de920a", - RequestId = "9aeb0fdf-c01e-0131-0922-9eb549000000", - ETag = "0x8D76C39E4407333", - ContentType = "image/png", - ContentLength = 30699, - BlobType = "BlockBlob", - Url = "https://gridtesting.blob.core.windows.net/testcontainer/{new-file}", - Sequencer = "000000000000000000000000000099240000000000c41c18" - }); - })) - .Done(c => c.MessageReceived) - .Run().ConfigureAwait(false); - - using (Assert.EnterMultipleScope()) - { - Assert.That(string.IsNullOrWhiteSpace(context.MessageId), Is.False); - Assert.That(context.Headers[Headers.MessageId], Is.EqualTo(context.MessageId), "Should populate the NServiceBus.MessageId header with the new value"); - } - } - - class CustomSerializationBehavior : IBehavior - { - // The custom serializer is required to ensure the outgoing message contains - // only the specific CloudEvents required headers and not the NServiceBus ones. - public Task Invoke(IDispatchContext context, Func next) - { - OutgoingMessage outgoingMessage = context.Operations.First().Message; - - Dictionary headers = outgoingMessage.Headers; - headers.Clear(); - headers[Headers.ContentType] = "application/json; charset=utf-8"; - headers["cloudEvents:specversion"] = "1.0"; - headers["cloudEvents:type"] = "Microsoft.Storage.BlobCreated"; - headers["cloudEvents:source"] = "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}"; - headers["cloudEvents:id"] = "9aeb0fdf-c01e-0131-0922-9eb54906e209"; - headers["cloudEvents:time"] = "2019-11-18T15:13:39.4589254Z"; - headers["subject"] = "blobServices/default/containers/{storage-container}/blobs/{new-file}"; - - return next(context); - } - } - - class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - public string MessageId { get; set; } - public Dictionary Headers { get; set; } - } - - class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(c => - { - var config = c.GetSettings().Get(CloudEventsEndpointConfigurationExtensions.CloudEventsSetting); - config.TypeMappings.Add("Microsoft.Storage.BlobCreated", [typeof(Message)]); - - c.Pipeline.Register("CustomSerializationBehavior", new CustomSerializationBehavior(), - "Serializing message"); - }); - } - - class Handler(Context testContext) : IHandleMessages - { - public Task Handle(Message message, IMessageHandlerContext context) - { - testContext.MessageId = context.MessageId; - testContext.Headers = context.MessageHeaders.ToDictionary(x => x.Key, x => x.Value); - testContext.MessageReceived = true; - - return Task.CompletedTask; - } - } - } - - - public class Message : IMessage - { - public string Api { get; set; } - public string ClientRequestId { get; set; } - public string RequestId { get; set; } - public string ETag { get; set; } - public string ContentType { get; set; } - public int ContentLength { get; set; } - public string BlobType { get; set; } - public string Url { get; set; } - public string Sequencer { get; set; } - } -} diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs deleted file mode 100644 index cdad636..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs +++ /dev/null @@ -1,120 +0,0 @@ -namespace NServiceBus.Envelope.CloudEvents.AcceptanceTests.CloudEvents; - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using AcceptanceTesting; -using Configuration.AdvancedExtensibility; -using NServiceBus.AcceptanceTests; -using NServiceBus.AcceptanceTests.EndpointTemplates; -using Pipeline; -using Transport; -using NUnit.Framework; - -public class When_http_binary_message_received : NServiceBusAcceptanceTest -{ - [Test] - public async Task An_http_binary_cloud_event_is_received() - { - var context = await Scenario.Define() - .WithEndpoint(g => g.When(b => - { - // The following represents a CloudEvent that Azure Blob Storage generates - // to notify that a new blob item has been created. - // Azure sends CloudEvents as JSON Structured. Below is the equivalent - // in the HTTP Binary format. - // The headers are set in the CustomSerializationBehavior. - return b.SendLocal(new Message() - { - Api = "PutBlockList", - ClientRequestId = "4c5dd7fb-2c48-4a27-bb30-5361b5de920a", - RequestId = "9aeb0fdf-c01e-0131-0922-9eb549000000", - ETag = "0x8D76C39E4407333", - ContentType = "image/png", - ContentLength = 30699, - BlobType = "BlockBlob", - Url = "https://gridtesting.blob.core.windows.net/testcontainer/{new-file}", - Sequencer = "000000000000000000000000000099240000000000c41c18" - }); - })) - .Done(c => c.MessageReceived) - .Run().ConfigureAwait(false); - - using (Assert.EnterMultipleScope()) - { - Assert.That(string.IsNullOrWhiteSpace(context.MessageId), Is.False); - Assert.That(context.Headers[Headers.MessageId], Is.EqualTo(context.MessageId), "Should populate the NServiceBus.MessageId header with the new value"); - } - } - - class CustomSerializationBehavior : IBehavior - { - // The custom serializer is required to ensure the outgoing message contains - // only the specific CloudEvents required headers and not the NServiceBus ones. - public Task Invoke(IDispatchContext context, Func next) - { - OutgoingMessage outgoingMessage = context.Operations.First().Message; - - Dictionary headers = outgoingMessage.Headers; - headers.Clear(); - headers[Headers.ContentType] = "application/json; charset=utf-8"; - headers["ce-specversion"] = "1.0"; - headers["ce-type"] = "Microsoft.Storage.BlobCreated"; - headers["ce-source"] = "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}"; - headers["ce-id"] = "9aeb0fdf-c01e-0131-0922-9eb54906e209"; - headers["ce-time"] = "2019-11-18T15:13:39.4589254Z"; - headers["subject"] = "blobServices/default/containers/{storage-container}/blobs/{new-file}"; - - return next(context); - } - } - - class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - public string MessageId { get; set; } - public Dictionary Headers { get; set; } - } - - class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(c => - { - var config = c.GetSettings().Get(CloudEventsEndpointConfigurationExtensions.CloudEventsSetting); - config.TypeMappings.Add("Microsoft.Storage.BlobCreated", [typeof(Message)]); - - c.Pipeline.Register("CustomSerializationBehavior", new CustomSerializationBehavior(), - "Serializing message"); - }); - } - - class Handler(Context testContext) : IHandleMessages - { - public Task Handle(Message message, IMessageHandlerContext context) - { - testContext.MessageId = context.MessageId; - testContext.Headers = context.MessageHeaders.ToDictionary(x => x.Key, x => x.Value); - testContext.MessageReceived = true; - - return Task.CompletedTask; - } - } - } - - - public class Message : IMessage - { - public string Api { get; set; } - public string ClientRequestId { get; set; } - public string RequestId { get; set; } - public string ETag { get; set; } - public string ContentType { get; set; } - public int ContentLength { get; set; } - public string BlobType { get; set; } - public string Url { get; set; } - public string Sequencer { get; set; } - } -} From 48e24e7f2f173cc6b6e3590eb31e8629c15a3417 Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Tue, 13 Jan 2026 21:12:45 +0100 Subject: [PATCH 08/21] Approved API --- ...IApprovals.ApproveNServiceBus.approved.txt | 77 ++++++++++++------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/ApprovalFiles/APIApprovals.ApproveNServiceBus.approved.txt b/src/NServiceBus.Envelope.CloudEvents.Tests/ApprovalFiles/APIApprovals.ApproveNServiceBus.approved.txt index 1ce48e3..caf4256 100644 --- a/src/NServiceBus.Envelope.CloudEvents.Tests/ApprovalFiles/APIApprovals.ApproveNServiceBus.approved.txt +++ b/src/NServiceBus.Envelope.CloudEvents.Tests/ApprovalFiles/APIApprovals.ApproveNServiceBus.approved.txt @@ -308,8 +308,11 @@ namespace NServiceBus public static class ErrorQueueSettings { public const string SettingsKey = "errorQueue"; - public static string ErrorQueueAddress(this NServiceBus.Settings.IReadOnlySettings settings) { } - public static bool TryGetExplicitlyConfiguredErrorQueueAddress(this NServiceBus.Settings.IReadOnlySettings settings, out string errorQueue) { } + extension(NServiceBus.Settings.IReadOnlySettings settings) + { + public string ErrorQueueAddress() { } + public bool TryGetExplicitlyConfiguredErrorQueueAddress([System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out string? errorQueue) { } + } } public class FailedConfig { @@ -463,10 +466,7 @@ namespace NServiceBus } public interface IEnvelopeHandler { - [return: System.Runtime.CompilerServices.TupleElementNames(new string[] { - "headers", - "body"})] - System.ValueTuple, System.ReadOnlyMemory>? UnwrapEnvelope(string nativeMessageId, System.Collections.Generic.IDictionary incomingHeaders, NServiceBus.Extensibility.ContextBag extensions, System.ReadOnlyMemory incomingBody); + System.Collections.Generic.Dictionary? UnwrapEnvelope(string nativeMessageId, System.Collections.Generic.IDictionary incomingHeaders, System.ReadOnlySpan incomingBody, NServiceBus.Extensibility.ContextBag extensions, System.Buffers.IBufferWriter bodyWriter); } public interface IHandleMessages { } public interface IHandleMessages : NServiceBus.IHandleMessages @@ -671,19 +671,6 @@ namespace NServiceBus public void LimitMessageProcessingConcurrencyTo(int maxConcurrency) { } } } - public abstract class MessagePropertyAccessor - { - protected MessagePropertyAccessor() { } - public abstract System.Type MessageType { get; } - public abstract object? AccessFrom(object message); - } - public abstract class MessagePropertyAccessor : NServiceBus.MessagePropertyAccessor - { - protected MessagePropertyAccessor() { } - public override sealed System.Type MessageType { get; } - protected abstract object? AccessFrom(TMessage message); - public override sealed object? AccessFrom(object message) { } - } public static class MessageSessionExtensions { public static System.Threading.Tasks.Task Publish(this NServiceBus.IMessageSession session, object message, System.Threading.CancellationToken cancellationToken = default) { } @@ -718,6 +705,8 @@ namespace NServiceBus public delegate System.Threading.Tasks.Task OnSatelliteMessage(System.IServiceProvider serviceProvider, NServiceBus.Transport.MessageContext messageContext, System.Threading.CancellationToken cancellationToken = default); public static class OpenTelemetryConfigurationExtensions { + [System.Obsolete("OpenTelemetry is now enabled by default. This method is no longer required. Will " + + "be removed in version 11.0.0.", true)] public static void EnableOpenTelemetry(this NServiceBus.EndpointConfiguration endpointConfiguration) { } } public static class OpenTelemetryExtensions @@ -784,7 +773,7 @@ namespace NServiceBus } public class RateLimitSettings { - public RateLimitSettings(System.TimeSpan? timeToWaitBetweenThrottledAttempts = default, System.Func onRateLimitStarted = null, System.Func onRateLimitEnded = null) { } + public RateLimitSettings(System.TimeSpan? timeToWaitBetweenThrottledAttempts = default, System.Func? onRateLimitStarted = null, System.Func? onRateLimitEnded = null) { } public System.Func OnRateLimitEnded { get; } public System.Func OnRateLimitStarted { get; } public System.TimeSpan TimeToWaitBetweenThrottledAttempts { get; } @@ -1148,6 +1137,7 @@ namespace NServiceBus public static NServiceBus.Serialization.SerializationExtensions Namespace(this NServiceBus.Serialization.SerializationExtensions config, string namespaceToUse) { } public static NServiceBus.Serialization.SerializationExtensions SanitizeInput(this NServiceBus.Serialization.SerializationExtensions config) { } } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("XmlSerializer is not supported in trimming scenarios.")] public class XmlSerializer : NServiceBus.Serialization.SerializationDefinition { public XmlSerializer() { } @@ -1445,13 +1435,9 @@ namespace NServiceBus.Features { public static void EnableFeature(this NServiceBus.Settings.SettingsHolder settings) where TFeature : NServiceBus.Features.Feature, new () { } - [System.Obsolete("It is no longer possible to enable features by default on the settings. Features " + - "can enable other features by calling EnableByDefault in the constructor. Will" + - " be removed in version 11.0.0.", true)] + [System.Obsolete(@"It is no longer possible to enable features by default on the settings. Features can enable other features by calling Enable in the constructor. Enabling a feature outside the context of another feature can be done by calling EnableFeature on the endpoint configuration or settings. Will be removed in version 11.0.0.", true)] public static NServiceBus.Settings.SettingsHolder EnableFeatureByDefault(this NServiceBus.Settings.SettingsHolder settings, System.Type featureType) { } - [System.Obsolete("It is no longer possible to enable features by default on the settings. Features " + - "can enable other features by calling EnableByDefault in the constructor. Will" + - " be removed in version 11.0.0.", true)] + [System.Obsolete(@"It is no longer possible to enable features by default on the settings. Features can enable other features by calling Enable in the constructor. Enabling a feature outside the context of another feature can be done by calling EnableFeature on the endpoint configuration or settings. Will be removed in version 11.0.0.", true)] public static NServiceBus.Settings.SettingsHolder EnableFeatureByDefault(this NServiceBus.Settings.SettingsHolder settings) where T : NServiceBus.Features.Feature { } [System.Obsolete("Use \'IsFeatureActive(this IReadOnlySettings settings)\' instead. Will be remove" + @@ -2109,6 +2095,12 @@ namespace NServiceBus.Sagas public string SagaId { get; } public void AttachNewEntity(NServiceBus.IContainSagaData sagaEntity) { } } + public abstract class CorrelationPropertyAccessor + { + protected CorrelationPropertyAccessor() { } + public abstract object? AccessFrom(NServiceBus.IContainSagaData sagaData); + public abstract void WriteTo(NServiceBus.IContainSagaData sagaData, object value); + } public interface IFinder { } [System.Obsolete(@"Saga not found handlers are no longer automatically registered during assembly scanning. Handlers are no longer global and should be registered for each saga using mapper.ConfigureNotFoundHandler(). Use 'ISagaNotFoundHandler' instead. Will be removed in version 11.0.0.", true)] public interface IHandleSagaNotFound @@ -2134,6 +2126,19 @@ namespace NServiceBus.Sagas System.Threading.Tasks.Task Save(NServiceBus.IContainSagaData sagaData, NServiceBus.Sagas.SagaCorrelationProperty correlationProperty, NServiceBus.Persistence.ISynchronizedStorageSession session, NServiceBus.Extensibility.ContextBag context, System.Threading.CancellationToken cancellationToken = default); System.Threading.Tasks.Task Update(NServiceBus.IContainSagaData sagaData, NServiceBus.Persistence.ISynchronizedStorageSession session, NServiceBus.Extensibility.ContextBag context, System.Threading.CancellationToken cancellationToken = default); } + public abstract class MessagePropertyAccessor + { + protected MessagePropertyAccessor() { } + public abstract System.Type MessageType { get; } + public abstract object? AccessFrom(object message); + } + public abstract class MessagePropertyAccessor : NServiceBus.Sagas.MessagePropertyAccessor + { + protected MessagePropertyAccessor() { } + public override sealed System.Type MessageType { get; } + protected abstract object? AccessFrom(TMessage message); + public override sealed object? AccessFrom(object message) { } + } public class SagaCorrelationProperty { public SagaCorrelationProperty(string name, object value) { } @@ -2186,13 +2191,14 @@ namespace NServiceBus.Sagas public static NServiceBus.Sagas.SagaMetadata Create(System.Type sagaType, System.Collections.Generic.IEnumerable availableTypes, NServiceBus.Conventions conventions) { } public static NServiceBus.Sagas.SagaMetadata Create() where TSaga : NServiceBus.Saga { } - public static NServiceBus.Sagas.SagaMetadata Create(System.Collections.Generic.IReadOnlyCollection associatedMessages, System.Collections.Generic.IReadOnlyCollection? propertyAccessors = null) + public static NServiceBus.Sagas.SagaMetadata Create(System.Collections.Generic.IReadOnlyCollection associatedMessages, NServiceBus.Sagas.CorrelationPropertyAccessor? correlationPropertyAccessor = null, System.Collections.Generic.IReadOnlyCollection? propertyAccessors = null) where TSaga : NServiceBus.Saga where TSagaData : class, NServiceBus.IContainSagaData, new () { } public static System.Collections.Generic.IEnumerable CreateMany(System.Collections.Generic.IEnumerable sagaTypes) { } public class CorrelationPropertyMetadata { - public CorrelationPropertyMetadata(string name, System.Type type) { } + public CorrelationPropertyMetadata(string name, System.Type type, NServiceBus.Sagas.CorrelationPropertyAccessor propertyAccessor) { } + public NServiceBus.Sagas.CorrelationPropertyAccessor Accessor { get; } public string Name { get; } public System.Type Type { get; } } @@ -2320,9 +2326,16 @@ namespace NServiceBus.Transport public NServiceBus.Settings.IReadOnlySettings? CoreSettings { get; } public System.Action CriticalErrorAction { get; } public string HostDisplayName { get; } + [System.Diagnostics.CodeAnalysis.MemberNotNullWhen(false, "CoreSettings")] + [get: System.Diagnostics.CodeAnalysis.MemberNotNullWhen(false, "CoreSettings")] + public bool IsRawMode { get; } public string Name { get; } + public System.IServiceProvider? ServiceProvider { get; set; } public bool SetupInfrastructure { get; } public NServiceBus.StartupDiagnosticEntries StartupDiagnostic { get; } + [System.Diagnostics.CodeAnalysis.MemberNotNullWhen(true, "ServiceProvider")] + [get: System.Diagnostics.CodeAnalysis.MemberNotNullWhen(true, "ServiceProvider")] + public bool SupportsDependencyInjection { get; } } public interface IMessageDispatcher { @@ -2432,6 +2445,8 @@ namespace NServiceBus.Transport public bool SupportsPublishSubscribe { get; } public bool SupportsTTBR { get; } public virtual NServiceBus.TransportTransactionMode TransportTransactionMode { get; set; } + public void ConfigureServices(Microsoft.Extensions.DependencyInjection.IServiceCollection services) { } + protected virtual void ConfigureServicesCore(Microsoft.Extensions.DependencyInjection.IServiceCollection services) { } protected void EnableEndpointFeature() where T : NServiceBus.Features.Feature, new () { } public abstract System.Collections.Generic.IReadOnlyCollection GetSupportedTransactionModes(); @@ -2515,10 +2530,16 @@ namespace NServiceBus.Unicast.Messages } public class MessageMetadataRegistry { + public MessageMetadataRegistry() { } + [System.Obsolete("Use \'MessageMetadataRegistry.Initialize\' instead. Will be removed in version 11.0" + + ".0.", true)] public MessageMetadataRegistry(System.Func isMessageType, bool allowDynamicTypeLoading) { } public NServiceBus.Unicast.Messages.MessageMetadata[] GetAllMessages() { } public NServiceBus.Unicast.Messages.MessageMetadata GetMessageMetadata(System.Type messageType) { } public NServiceBus.Unicast.Messages.MessageMetadata GetMessageMetadata(string messageTypeIdentifier) { } + public void Initialize(System.Func isMessageType, bool allowDynamicTypeLoading) { } + public void RegisterMessageTypeWithHierarchy(System.Type messageType, System.Collections.Generic.IEnumerable parentMessages) { } + public void RegisterMessageTypes(System.Collections.Generic.IEnumerable messageTypes) { } } } namespace NServiceBus.Unicast.Queuing From 06162b8c38a3ebf0bac4fb770447093353f8f7e9 Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Tue, 13 Jan 2026 21:13:06 +0100 Subject: [PATCH 09/21] Use SAX parser Utf8JsonReader --- ...EventJsonStructuredEnvelopeHandlerTests.cs | 2 +- ...CloudEventJsonStructuredEnvelopeHandler.cs | 215 ++++++++++++++---- 2 files changed, 167 insertions(+), 50 deletions(-) diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs index a2372eb..7864b19 100644 --- a/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs +++ b/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs @@ -422,7 +422,7 @@ public void Should_emit_metric_for_wrong_content_type() [Test] public void Should_throw_for_invalid_body() { - Assert.Throws(() => + Assert.Throws(Is.InstanceOf(), () => { var bodyWriter = new ArrayBufferWriter(); EnvelopeHandler.UnwrapEnvelope(NativeMessageId, NativeHeaders, ReadOnlySpan.Empty, new ContextBag(), bodyWriter); diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeHandler.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeHandler.cs index f9f1bf6..4008949 100644 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeHandler.cs +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeHandler.cs @@ -26,16 +26,41 @@ static class CloudEventJsonStructuredConstants internal static readonly HashSet HeadersToIgnore = [DataProperty, DataBase64Property]; } +class CloudEventPropertyValue +{ + public JsonValueKind ValueKind { get; init; } + public string? StringValue { get; init; } + public ReadOnlyMemory RawJsonBytes { get; init; } + + public string GetString() => StringValue ?? throw new InvalidOperationException("Value is not a string"); + public string GetRawText() => Encoding.UTF8.GetString(RawJsonBytes.Span); +} + +class CloudEventProperties +{ + readonly Dictionary properties = new(StringComparer.OrdinalIgnoreCase); + + public void Add(string name, CloudEventPropertyValue value) => properties[name] = value; + + public bool TryGetValue(string key, [MaybeNullWhen(false)] out CloudEventPropertyValue value) => + properties.TryGetValue(key, out value); + + public bool ContainsKey(string key) => properties.ContainsKey(key); + + public CloudEventPropertyValue this[string key] => properties[key]; + + public IEnumerable> Properties => properties; +} + class CloudEventJsonStructuredEnvelopeHandler(CloudEventsMetrics metrics, CloudEventsConfiguration config) : IEnvelopeHandler { static readonly ILog Log = LogManager.GetLogger(); - static readonly JsonSerializerOptions Options = new() { PropertyNameCaseInsensitive = true }; public Dictionary? UnwrapEnvelope(string nativeMessageId, IDictionary incomingHeaders, ReadOnlySpan incomingBody, ContextBag extensions, IBufferWriter bodyWriter) { var isStrict = config.EnvelopeUnwrappers.Find().EnvelopeHandlingMode == JsonStructureEnvelopeHandlingMode.Strict; - Dictionary? receivedCloudEvent = isStrict + CloudEventProperties? receivedCloudEvent = isStrict ? StrictHandler.DeserializeOrThrow(nativeMessageId, incomingHeaders, incomingBody, metrics) : PermissiveHandler.DeserializeOrThrow(nativeMessageId, incomingBody, metrics); @@ -48,25 +73,126 @@ class CloudEventJsonStructuredEnvelopeHandler(CloudEventsMetrics metrics, CloudE return ExtractHeaders(nativeMessageId, incomingHeaders, receivedCloudEvent); } + static CloudEventProperties? ParseCloudEventJson(ReadOnlySpan json) + { + var reader = new Utf8JsonReader(json); + + if (!reader.Read() || reader.TokenType != JsonTokenType.StartObject) + { + return null; + } + + var properties = new CloudEventProperties(); + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndObject) + { + break; + } + + if (reader.TokenType != JsonTokenType.PropertyName) + { + continue; + } + + var propertyName = reader.GetString(); + if (propertyName == null) + { + continue; + } + + // Normalize to lowercase for case-insensitive matching + propertyName = propertyName.ToLowerInvariant(); + + reader.Read(); + + var valueKind = reader.TokenType switch + { + JsonTokenType.String => JsonValueKind.String, + JsonTokenType.Number => JsonValueKind.Number, + JsonTokenType.True or JsonTokenType.False => JsonValueKind.True, + JsonTokenType.Null => JsonValueKind.Null, + JsonTokenType.StartObject => JsonValueKind.Object, + JsonTokenType.StartArray => JsonValueKind.Array, + JsonTokenType.None => JsonValueKind.Undefined, + JsonTokenType.Comment => JsonValueKind.Undefined, + JsonTokenType.EndObject => JsonValueKind.Undefined, + JsonTokenType.EndArray => JsonValueKind.Undefined, + JsonTokenType.PropertyName => JsonValueKind.Undefined, + _ => JsonValueKind.Undefined + }; + + CloudEventPropertyValue value = valueKind switch + { + JsonValueKind.String => new CloudEventPropertyValue + { + ValueKind = JsonValueKind.String, + StringValue = reader.GetString() + }, + JsonValueKind.Object or JsonValueKind.Array => CaptureComplexValue(ref reader, json, valueKind), + JsonValueKind.Number or JsonValueKind.True or JsonValueKind.False or JsonValueKind.Null or JsonValueKind.Undefined => CapturePrimitiveValue(ref reader, valueKind), + _ => CapturePrimitiveValue(ref reader, valueKind) + }; + + properties.Add(propertyName, value); + } + + return properties; + } + + static CloudEventPropertyValue CaptureComplexValue(ref Utf8JsonReader reader, ReadOnlySpan json, JsonValueKind valueKind) + { + // Capture the raw JSON for complex types + var startPosition = reader.TokenStartIndex; + var depth = reader.CurrentDepth; + + // Skip the entire object/array + while (reader.Read() && reader.CurrentDepth > depth) + { + } + + var length = (int)(reader.TokenStartIndex + reader.ValueSpan.Length - startPosition); + var rawJson = json.Slice((int)startPosition, length); + + return new CloudEventPropertyValue + { + ValueKind = valueKind, + RawJsonBytes = rawJson.ToArray() + }; + } + + static CloudEventPropertyValue CapturePrimitiveValue(ref Utf8JsonReader reader, JsonValueKind valueKind) + { + // For primitive types, capture as both string and raw JSON + var rawJson = reader.ValueSpan; + return new CloudEventPropertyValue + { + ValueKind = valueKind, + StringValue = valueKind == JsonValueKind.Number ? reader.GetDouble().ToString() : reader.GetString(), + RawJsonBytes = rawJson.ToArray() + }; + } + Dictionary ExtractHeaders(string nativeMessageId, IDictionary existingHeaders, - Dictionary receivedCloudEvent) + CloudEventProperties receivedCloudEvent) { var headersCopy = existingHeaders.ToDictionary(k => k.Key, k => k.Value); - foreach (var kvp in receivedCloudEvent) + foreach (var kvp in receivedCloudEvent.Properties) { if ( CloudEventJsonStructuredConstants.HeadersToIgnore.Contains(kvp.Key) - || kvp.Value.Value.ValueKind == JsonValueKind.Undefined - || kvp.Value.Value.ValueKind == JsonValueKind.Null + || kvp.Value.ValueKind == JsonValueKind.Undefined + || kvp.Value.ValueKind == JsonValueKind.Null ) { continue; } - headersCopy[kvp.Key] = kvp.Value.Value.ValueKind == JsonValueKind.String - ? kvp.Value.Value.GetString()! - : kvp.Value.Value.GetRawText(); + headersCopy[kvp.Key] = kvp.Value.ValueKind == JsonValueKind.String + ? kvp.Value.GetString() + : kvp.Value.GetRawText(); if (Log.IsDebugEnabled) { @@ -135,15 +261,15 @@ Dictionary ExtractHeaders(string nativeMessageId, IDictionary receivedCloudEvent) + string ExtractType(CloudEventProperties receivedCloudEvent) { - var cloudEventType = receivedCloudEvent[CloudEventJsonStructuredConstants.TypeProperty].Value.GetString()!; + var cloudEventType = receivedCloudEvent[CloudEventJsonStructuredConstants.TypeProperty].GetString(); return config.TypeMappings.TryGetValue(cloudEventType, out var typeMapping) ? string.Join(',', typeMapping) : cloudEventType; } - static void ExtractBody(string nativeMessageId, Dictionary receivedCloudEvent, IBufferWriter bodyWriter) + static void ExtractBody(string nativeMessageId, CloudEventProperties receivedCloudEvent, IBufferWriter bodyWriter) { if (TryGetHeader(receivedCloudEvent, CloudEventJsonStructuredConstants.DataBase64Property, out var base64Body)) { @@ -164,13 +290,13 @@ static void ExtractBody(string nativeMessageId, Dictionary } if (receivedCloudEvent.TryGetValue(CloudEventJsonStructuredConstants.DataContentTypeProperty, - out var property) && !property.Value.GetString()!.EndsWith(CloudEventJsonStructuredConstants.JsonSuffix)) + out var property) && !property.GetString().EndsWith(CloudEventJsonStructuredConstants.JsonSuffix)) { if (Log.IsDebugEnabled) { Log.DebugFormat("Passing inner body as text for message {0}", nativeMessageId); } - var bytes = Encoding.UTF8.GetBytes(data.Value.GetString()!); + var bytes = Encoding.UTF8.GetBytes(data.GetString()); bodyWriter.Write(bytes); return; } @@ -179,10 +305,9 @@ static void ExtractBody(string nativeMessageId, Dictionary { Log.DebugFormat("Passing inner body as JSON for message {0}", nativeMessageId); } - if (data.Value.ValueKind is not JsonValueKind.Undefined and not JsonValueKind.Null) + if (data.ValueKind is not JsonValueKind.Undefined and not JsonValueKind.Null) { - var bytes = Encoding.UTF8.GetBytes(data.Value.GetRawText()); - bodyWriter.Write(bytes); + bodyWriter.Write(data.RawJsonBytes.Span); return; } } @@ -193,13 +318,13 @@ static void ExtractBody(string nativeMessageId, Dictionary } } - static bool TryGetHeader(Dictionary receivedCloudEvent, string header, [MaybeNullWhen(false)] out string result) + static bool TryGetHeader(CloudEventProperties receivedCloudEvent, string header, [MaybeNullWhen(false)] out string result) { if (receivedCloudEvent.TryGetValue(header, out var value) - && value.Value.ValueKind != JsonValueKind.Undefined - && value.Value.ValueKind != JsonValueKind.Null) + && value.ValueKind != JsonValueKind.Undefined + && value.ValueKind != JsonValueKind.Null) { - result = value.Value.GetString()!; + result = value.GetString(); return true; } @@ -207,11 +332,6 @@ static bool TryGetHeader(Dictionary receivedCloudEvent, st return false; } - static Dictionary ToCaseInsensitiveDictionary(JsonDocument receivedCloudEvent) => - receivedCloudEvent.RootElement.EnumerateObject() - .ToDictionary(p => p.Name.ToLowerInvariant(), p => p, - StringComparer.OrdinalIgnoreCase); - static class StrictHandler { static readonly string[] RequiredProperties = [ @@ -220,7 +340,7 @@ static class StrictHandler CloudEventJsonStructuredConstants.TypeProperty ]; - internal static Dictionary? DeserializeOrThrow(string nativeMessageId, + internal static CloudEventProperties? DeserializeOrThrow(string nativeMessageId, IDictionary incomingHeaders, ReadOnlySpan body, CloudEventsMetrics metrics) { @@ -240,10 +360,10 @@ static class StrictHandler } metrics.RecordAttemptingToUnwrap(CloudEventsMetrics.CloudEventTypes.JSON_STRUCTURED_STRICT); - JsonDocument? receivedCloudEvent; + CloudEventProperties? receivedCloudEvent; try { - receivedCloudEvent = JsonSerializer.Deserialize(body, Options); + receivedCloudEvent = ParseCloudEventJson(body); } catch (Exception e) { @@ -270,9 +390,8 @@ static class StrictHandler Log.DebugFormat("Message {0} has been deserialized correctly", nativeMessageId); } - Dictionary caseInsensitiveProperties = ToCaseInsensitiveDictionary(receivedCloudEvent); - ThrowIfInvalidCloudEventAndRecordMetrics(nativeMessageId, caseInsensitiveProperties, metrics); - return caseInsensitiveProperties; + ThrowIfInvalidCloudEventAndRecordMetrics(nativeMessageId, receivedCloudEvent, metrics); + return receivedCloudEvent; } static bool HasCorrectContentTypeHeader(IDictionary incomingHeaders) => @@ -280,11 +399,11 @@ static bool HasCorrectContentTypeHeader(IDictionary incomingHead (value == CloudEventJsonStructuredConstants.SupportedContentType || value.Contains(CloudEventJsonStructuredConstants.SupportedContentType)); static void ThrowIfInvalidCloudEventAndRecordMetrics(string nativeMessageId, - Dictionary receivedCloudEvent, CloudEventsMetrics metrics) + CloudEventProperties receivedCloudEvent, CloudEventsMetrics metrics) { foreach (var property in RequiredProperties) { - if (!receivedCloudEvent.TryGetValue(property, out _)) + if (!receivedCloudEvent.ContainsKey(property)) { if (Log.IsWarnEnabled) { @@ -295,8 +414,8 @@ static void ThrowIfInvalidCloudEventAndRecordMetrics(string nativeMessageId, } } - if (!receivedCloudEvent.TryGetValue(CloudEventJsonStructuredConstants.DataBase64Property, out _) && - !receivedCloudEvent.TryGetValue(CloudEventJsonStructuredConstants.DataProperty, out _)) + if (!receivedCloudEvent.ContainsKey(CloudEventJsonStructuredConstants.DataBase64Property) && + !receivedCloudEvent.ContainsKey(CloudEventJsonStructuredConstants.DataProperty)) { if (Log.IsWarnEnabled) { @@ -314,7 +433,7 @@ static void ThrowIfInvalidCloudEventAndRecordMetrics(string nativeMessageId, if (receivedCloudEvent.TryGetValue(CloudEventJsonStructuredConstants.VersionProperty, out var version)) { - var versionValue = version.Value.GetString(); + var versionValue = version.GetString(); if (versionValue != CloudEventJsonStructuredConstants.SupportedVersion) { @@ -346,15 +465,15 @@ static void ThrowIfInvalidCloudEventAndRecordMetrics(string nativeMessageId, static class PermissiveHandler { - internal static Dictionary? DeserializeOrThrow(string nativeMessageId, + internal static CloudEventProperties? DeserializeOrThrow(string nativeMessageId, ReadOnlySpan body, CloudEventsMetrics metrics) { metrics.RecordAttemptingToUnwrap(CloudEventsMetrics.CloudEventTypes.JSON_STRUCTURED_PERMISSIVE); - JsonDocument? receivedCloudEvent; + CloudEventProperties? receivedCloudEvent; try { - receivedCloudEvent = JsonSerializer.Deserialize(body, Options); + receivedCloudEvent = ParseCloudEventJson(body); } catch (Exception e) { @@ -375,23 +494,21 @@ static class PermissiveHandler return null; } - Dictionary caseInsensitiveProperties = ToCaseInsensitiveDictionary(receivedCloudEvent); - - if (!caseInsensitiveProperties.TryGetValue(CloudEventJsonStructuredConstants.TypeProperty, out _)) + if (!receivedCloudEvent.ContainsKey(CloudEventJsonStructuredConstants.TypeProperty)) { if (Log.IsDebugEnabled) { - Log.DebugFormat("No data field for the message {0}", nativeMessageId); + Log.DebugFormat("No type field for the message {0}", nativeMessageId); } return null; } - RecordMetrics(nativeMessageId, caseInsensitiveProperties, metrics); + RecordMetrics(nativeMessageId, receivedCloudEvent, metrics); - return caseInsensitiveProperties; + return receivedCloudEvent; } - static void RecordMetrics(string nativeMessageId, Dictionary receivedCloudEvent, + static void RecordMetrics(string nativeMessageId, CloudEventProperties receivedCloudEvent, CloudEventsMetrics metrics) { if (Log.IsDebugEnabled) @@ -402,7 +519,7 @@ static void RecordMetrics(string nativeMessageId, Dictionary Date: Tue, 13 Jan 2026 21:13:20 +0100 Subject: [PATCH 10/21] Benchmarks results --- ...elopeHandlerBenchmarks-20260113-210159.log | 1078 +++++++++++++++++ 1 file changed, 1078 insertions(+) create mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-210159.log diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-210159.log b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-210159.log new file mode 100644 index 0000000..60474fc --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-210159.log @@ -0,0 +1,1078 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 10 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:IntermediateOutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/obj/Release/net10.0/" /p:OutDir="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/" /p:OutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/" in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667 +// command took 0.78 sec and exited with 0 +// start dotnet build -c Release --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:IntermediateOutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/obj/Release/net10.0/" /p:OutDir="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/" /p:OutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/" --output "/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/" in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667 +// command took 7.99 sec and exited with 0 +// ***** Done, took 00:00:08 (8.83 sec) ***** +// Found 10 benchmarks: +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) + +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_SmallJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 0 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-GOQIEV(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 207541.00 ns, 207.5410 us/op +2026-01-13 21:02:08.446 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 38068292.00 ns, 38.0683 ms/op + +WorkloadPilot 1: 2 op, 117000.00 ns, 58.5000 us/op +WorkloadPilot 2: 3 op, 46083.00 ns, 15.3610 us/op +WorkloadPilot 3: 4 op, 45500.00 ns, 11.3750 us/op +WorkloadPilot 4: 5 op, 39334.00 ns, 7.8668 us/op +WorkloadPilot 5: 6 op, 32000.00 ns, 5.3333 us/op +WorkloadPilot 6: 7 op, 34750.00 ns, 4.9643 us/op +WorkloadPilot 7: 8 op, 38334.00 ns, 4.7918 us/op +WorkloadPilot 8: 9 op, 42292.00 ns, 4.6991 us/op +WorkloadPilot 9: 10 op, 72500.00 ns, 7.2500 us/op +WorkloadPilot 10: 11 op, 134958.00 ns, 12.2689 us/op +WorkloadPilot 11: 12 op, 77500.00 ns, 6.4583 us/op +WorkloadPilot 12: 13 op, 68625.00 ns, 5.2788 us/op +WorkloadPilot 13: 14 op, 67291.00 ns, 4.8065 us/op +WorkloadPilot 14: 15 op, 76459.00 ns, 5.0973 us/op +WorkloadPilot 15: 16 op, 71500.00 ns, 4.4688 us/op +WorkloadPilot 16: 32 op, 148917.00 ns, 4.6537 us/op +WorkloadPilot 17: 64 op, 291125.00 ns, 4.5488 us/op +WorkloadPilot 18: 128 op, 595209.00 ns, 4.6501 us/op +WorkloadPilot 19: 256 op, 1126458.00 ns, 4.4002 us/op +WorkloadPilot 20: 512 op, 2153917.00 ns, 4.2069 us/op +WorkloadPilot 21: 1024 op, 4725208.00 ns, 4.6145 us/op +WorkloadPilot 22: 2048 op, 9662917.00 ns, 4.7182 us/op +WorkloadPilot 23: 4096 op, 18008042.00 ns, 4.3965 us/op +WorkloadPilot 24: 8192 op, 36305250.00 ns, 4.4318 us/op +WorkloadPilot 25: 16384 op, 72030083.00 ns, 4.3964 us/op +WorkloadPilot 26: 32768 op, 146810125.00 ns, 4.4803 us/op +WorkloadPilot 27: 65536 op, 323392125.00 ns, 4.9346 us/op +WorkloadPilot 28: 131072 op, 217264666.00 ns, 1.6576 us/op +WorkloadPilot 29: 262144 op, 359248208.00 ns, 1.3704 us/op +WorkloadPilot 30: 524288 op, 720317416.00 ns, 1.3739 us/op + +WorkloadWarmup 1: 524288 op, 732052916.00 ns, 1.3963 us/op +WorkloadWarmup 2: 524288 op, 719301792.00 ns, 1.3720 us/op +WorkloadWarmup 3: 524288 op, 725888458.00 ns, 1.3845 us/op + +// BeforeActualRun +WorkloadActual 1: 524288 op, 717379208.00 ns, 1.3683 us/op +WorkloadActual 2: 524288 op, 715617750.00 ns, 1.3649 us/op +WorkloadActual 3: 524288 op, 720504458.00 ns, 1.3743 us/op +WorkloadActual 4: 524288 op, 714381875.00 ns, 1.3626 us/op +WorkloadActual 5: 524288 op, 719364958.00 ns, 1.3721 us/op +WorkloadActual 6: 524288 op, 718320000.00 ns, 1.3701 us/op +WorkloadActual 7: 524288 op, 711796084.00 ns, 1.3576 us/op +WorkloadActual 8: 524288 op, 719132167.00 ns, 1.3716 us/op +WorkloadActual 9: 524288 op, 710407542.00 ns, 1.3550 us/op +WorkloadActual 10: 524288 op, 718937084.00 ns, 1.3713 us/op + +// AfterActualRun +WorkloadResult 1: 524288 op, 717379208.00 ns, 1.3683 us/op +WorkloadResult 2: 524288 op, 715617750.00 ns, 1.3649 us/op +WorkloadResult 3: 524288 op, 720504458.00 ns, 1.3743 us/op +WorkloadResult 4: 524288 op, 714381875.00 ns, 1.3626 us/op +WorkloadResult 5: 524288 op, 719364958.00 ns, 1.3721 us/op +WorkloadResult 6: 524288 op, 718320000.00 ns, 1.3701 us/op +WorkloadResult 7: 524288 op, 711796084.00 ns, 1.3576 us/op +WorkloadResult 8: 524288 op, 719132167.00 ns, 1.3716 us/op +WorkloadResult 9: 524288 op, 710407542.00 ns, 1.3550 us/op +WorkloadResult 10: 524288 op, 718937084.00 ns, 1.3713 us/op +// GC: 277 1 0 1740746208 524288 +// Threading: 0 0 524288 + +// AfterAll +// Benchmark Process 14410 has exited with code 0. + +Mean = 1.367 μs, StdErr = 0.002 μs (0.15%), N = 10, StdDev = 0.007 μs +Min = 1.355 μs, Q1 = 1.363 μs, Median = 1.369 μs, Q3 = 1.372 μs, Max = 1.374 μs +IQR = 0.008 μs, LowerFence = 1.351 μs, UpperFence = 1.384 μs +ConfidenceInterval = [1.357 μs; 1.377 μs] (CI 99.9%), Margin = 0.010 μs (0.72% of Mean) +Skewness = -0.6, Kurtosis = 1.73, MValue = 2 + +// ** Remained 9 (90,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 1m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_SmallJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 1 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-TVPIMQ(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 172375.00 ns, 172.3750 us/op +2026-01-13 21:02:20.712 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 40745375.00 ns, 40.7454 ms/op + +WorkloadPilot 1: 2 op, 60833.00 ns, 30.4165 us/op +WorkloadPilot 2: 3 op, 23875.00 ns, 7.9583 us/op +WorkloadPilot 3: 4 op, 38542.00 ns, 9.6355 us/op +WorkloadPilot 4: 5 op, 32917.00 ns, 6.5834 us/op +WorkloadPilot 5: 6 op, 58041.00 ns, 9.6735 us/op +WorkloadPilot 6: 7 op, 61750.00 ns, 8.8214 us/op +WorkloadPilot 7: 8 op, 55375.00 ns, 6.9219 us/op +WorkloadPilot 8: 9 op, 47500.00 ns, 5.2778 us/op +WorkloadPilot 9: 10 op, 52666.00 ns, 5.2666 us/op +WorkloadPilot 10: 11 op, 69709.00 ns, 6.3372 us/op +WorkloadPilot 11: 12 op, 64958.00 ns, 5.4132 us/op +WorkloadPilot 12: 13 op, 67541.00 ns, 5.1955 us/op +WorkloadPilot 13: 14 op, 83458.00 ns, 5.9613 us/op +WorkloadPilot 14: 15 op, 75292.00 ns, 5.0195 us/op +WorkloadPilot 15: 16 op, 78375.00 ns, 4.8984 us/op +WorkloadPilot 16: 32 op, 198625.00 ns, 6.2070 us/op +WorkloadPilot 17: 64 op, 300709.00 ns, 4.6986 us/op +WorkloadPilot 18: 128 op, 595125.00 ns, 4.6494 us/op +WorkloadPilot 19: 256 op, 1119875.00 ns, 4.3745 us/op +WorkloadPilot 20: 512 op, 2301667.00 ns, 4.4954 us/op +WorkloadPilot 21: 1024 op, 4792125.00 ns, 4.6798 us/op +WorkloadPilot 22: 2048 op, 10016250.00 ns, 4.8907 us/op +WorkloadPilot 23: 4096 op, 18613958.00 ns, 4.5444 us/op +WorkloadPilot 24: 8192 op, 38010167.00 ns, 4.6399 us/op +WorkloadPilot 25: 16384 op, 76626250.00 ns, 4.6769 us/op +WorkloadPilot 26: 32768 op, 169438000.00 ns, 5.1708 us/op +WorkloadPilot 27: 65536 op, 272264542.00 ns, 4.1544 us/op +WorkloadPilot 28: 131072 op, 193921625.00 ns, 1.4795 us/op +WorkloadPilot 29: 262144 op, 371248291.00 ns, 1.4162 us/op +WorkloadPilot 30: 524288 op, 742296291.00 ns, 1.4158 us/op + +WorkloadWarmup 1: 524288 op, 744202792.00 ns, 1.4195 us/op +WorkloadWarmup 2: 524288 op, 745451542.00 ns, 1.4218 us/op +WorkloadWarmup 3: 524288 op, 749004209.00 ns, 1.4286 us/op + +// BeforeActualRun +WorkloadActual 1: 524288 op, 738262250.00 ns, 1.4081 us/op +WorkloadActual 2: 524288 op, 743777292.00 ns, 1.4186 us/op +WorkloadActual 3: 524288 op, 736863208.00 ns, 1.4055 us/op +WorkloadActual 4: 524288 op, 740554709.00 ns, 1.4125 us/op +WorkloadActual 5: 524288 op, 744649167.00 ns, 1.4203 us/op +WorkloadActual 6: 524288 op, 739170583.00 ns, 1.4099 us/op +WorkloadActual 7: 524288 op, 744343750.00 ns, 1.4197 us/op +WorkloadActual 8: 524288 op, 736525375.00 ns, 1.4048 us/op +WorkloadActual 9: 524288 op, 744202416.00 ns, 1.4195 us/op +WorkloadActual 10: 524288 op, 745787250.00 ns, 1.4225 us/op + +// AfterActualRun +WorkloadResult 1: 524288 op, 738262250.00 ns, 1.4081 us/op +WorkloadResult 2: 524288 op, 743777292.00 ns, 1.4186 us/op +WorkloadResult 3: 524288 op, 736863208.00 ns, 1.4055 us/op +WorkloadResult 4: 524288 op, 740554709.00 ns, 1.4125 us/op +WorkloadResult 5: 524288 op, 744649167.00 ns, 1.4203 us/op +WorkloadResult 6: 524288 op, 739170583.00 ns, 1.4099 us/op +WorkloadResult 7: 524288 op, 744343750.00 ns, 1.4197 us/op +WorkloadResult 8: 524288 op, 736525375.00 ns, 1.4048 us/op +WorkloadResult 9: 524288 op, 744202416.00 ns, 1.4195 us/op +WorkloadResult 10: 524288 op, 745787250.00 ns, 1.4225 us/op +// GC: 277 1 0 1740746208 524288 +// Threading: 0 0 524288 + +// AfterAll +// Benchmark Process 14416 has exited with code 0. + +Mean = 1.414 μs, StdErr = 0.002 μs (0.15%), N = 10, StdDev = 0.007 μs +Min = 1.405 μs, Q1 = 1.409 μs, Median = 1.416 μs, Q3 = 1.420 μs, Max = 1.422 μs +IQR = 0.011 μs, LowerFence = 1.392 μs, UpperFence = 1.436 μs +ConfidenceInterval = [1.404 μs; 1.424 μs] (CI 99.9%), Margin = 0.010 μs (0.72% of Mean) +Skewness = -0.17, Kurtosis = 1.14, MValue = 2 + +// ** Remained 8 (80,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 1m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_MediumJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 2 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-NEZGTD(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 209750.00 ns, 209.7500 us/op +2026-01-13 21:02:33.254 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 40149250.00 ns, 40.1493 ms/op + +WorkloadPilot 1: 2 op, 81250.00 ns, 40.6250 us/op +WorkloadPilot 2: 3 op, 42083.00 ns, 14.0277 us/op +WorkloadPilot 3: 4 op, 45417.00 ns, 11.3543 us/op +WorkloadPilot 4: 5 op, 41583.00 ns, 8.3166 us/op +WorkloadPilot 5: 6 op, 42541.00 ns, 7.0902 us/op +WorkloadPilot 6: 7 op, 48917.00 ns, 6.9881 us/op +WorkloadPilot 7: 8 op, 53208.00 ns, 6.6510 us/op +WorkloadPilot 8: 9 op, 59292.00 ns, 6.5880 us/op +WorkloadPilot 9: 10 op, 64542.00 ns, 6.4542 us/op +WorkloadPilot 10: 11 op, 70292.00 ns, 6.3902 us/op +WorkloadPilot 11: 12 op, 79375.00 ns, 6.6146 us/op +WorkloadPilot 12: 13 op, 86750.00 ns, 6.6731 us/op +WorkloadPilot 13: 14 op, 104625.00 ns, 7.4732 us/op +WorkloadPilot 14: 15 op, 105250.00 ns, 7.0167 us/op +WorkloadPilot 15: 16 op, 104750.00 ns, 6.5469 us/op +WorkloadPilot 16: 32 op, 205125.00 ns, 6.4102 us/op +WorkloadPilot 17: 64 op, 416709.00 ns, 6.5111 us/op +WorkloadPilot 18: 128 op, 870375.00 ns, 6.7998 us/op +WorkloadPilot 19: 256 op, 1778167.00 ns, 6.9460 us/op +WorkloadPilot 20: 512 op, 3291625.00 ns, 6.4290 us/op +WorkloadPilot 21: 1024 op, 6822125.00 ns, 6.6622 us/op +WorkloadPilot 22: 2048 op, 13684500.00 ns, 6.6819 us/op +WorkloadPilot 23: 4096 op, 26236125.00 ns, 6.4053 us/op +WorkloadPilot 24: 8192 op, 50069583.00 ns, 6.1120 us/op +WorkloadPilot 25: 16384 op, 102843416.00 ns, 6.2771 us/op +WorkloadPilot 26: 32768 op, 236654000.00 ns, 7.2221 us/op +WorkloadPilot 27: 65536 op, 295246833.00 ns, 4.5051 us/op +WorkloadPilot 28: 131072 op, 271657708.00 ns, 2.0726 us/op +WorkloadPilot 29: 262144 op, 538970458.00 ns, 2.0560 us/op + +WorkloadWarmup 1: 262144 op, 538782625.00 ns, 2.0553 us/op +WorkloadWarmup 2: 262144 op, 534848584.00 ns, 2.0403 us/op +WorkloadWarmup 3: 262144 op, 546599541.00 ns, 2.0851 us/op + +// BeforeActualRun +WorkloadActual 1: 262144 op, 538027959.00 ns, 2.0524 us/op +WorkloadActual 2: 262144 op, 539241083.00 ns, 2.0570 us/op +WorkloadActual 3: 262144 op, 539895583.00 ns, 2.0595 us/op +WorkloadActual 4: 262144 op, 536867375.00 ns, 2.0480 us/op +WorkloadActual 5: 262144 op, 538689583.00 ns, 2.0549 us/op +WorkloadActual 6: 262144 op, 534301875.00 ns, 2.0382 us/op +WorkloadActual 7: 262144 op, 541572833.00 ns, 2.0659 us/op +WorkloadActual 8: 262144 op, 536549166.00 ns, 2.0468 us/op +WorkloadActual 9: 262144 op, 539108584.00 ns, 2.0565 us/op +WorkloadActual 10: 262144 op, 537123834.00 ns, 2.0490 us/op + +// AfterActualRun +WorkloadResult 1: 262144 op, 538027959.00 ns, 2.0524 us/op +WorkloadResult 2: 262144 op, 539241083.00 ns, 2.0570 us/op +WorkloadResult 3: 262144 op, 539895583.00 ns, 2.0595 us/op +WorkloadResult 4: 262144 op, 536867375.00 ns, 2.0480 us/op +WorkloadResult 5: 262144 op, 538689583.00 ns, 2.0549 us/op +WorkloadResult 6: 262144 op, 534301875.00 ns, 2.0382 us/op +WorkloadResult 7: 262144 op, 541572833.00 ns, 2.0659 us/op +WorkloadResult 8: 262144 op, 536549166.00 ns, 2.0468 us/op +WorkloadResult 9: 262144 op, 539108584.00 ns, 2.0565 us/op +WorkloadResult 10: 262144 op, 537123834.00 ns, 2.0490 us/op +// GC: 175 1 0 1098977712 262144 +// Threading: 0 0 262144 + +// AfterAll +// Benchmark Process 14421 has exited with code 0. + +Mean = 2.053 μs, StdErr = 0.002 μs (0.12%), N = 10, StdDev = 0.008 μs +Min = 2.038 μs, Q1 = 2.048 μs, Median = 2.054 μs, Q3 = 2.057 μs, Max = 2.066 μs +IQR = 0.009 μs, LowerFence = 2.035 μs, UpperFence = 2.070 μs +ConfidenceInterval = [2.041 μs; 2.065 μs] (CI 99.9%), Margin = 0.012 μs (0.57% of Mean) +Skewness = -0.18, Kurtosis = 2.21, MValue = 2 + +// ** Remained 7 (70,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 1m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_MediumJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 3 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-IPURDY(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 255875.00 ns, 255.8750 us/op +2026-01-13 21:02:42.593 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 39160583.00 ns, 39.1606 ms/op + +WorkloadPilot 1: 2 op, 73583.00 ns, 36.7915 us/op +WorkloadPilot 2: 3 op, 29541.00 ns, 9.8470 us/op +WorkloadPilot 3: 4 op, 32041.00 ns, 8.0103 us/op +WorkloadPilot 4: 5 op, 37375.00 ns, 7.4750 us/op +WorkloadPilot 5: 6 op, 43292.00 ns, 7.2153 us/op +WorkloadPilot 6: 7 op, 50292.00 ns, 7.1846 us/op +WorkloadPilot 7: 8 op, 77042.00 ns, 9.6303 us/op +WorkloadPilot 8: 9 op, 122042.00 ns, 13.5602 us/op +WorkloadPilot 9: 10 op, 126167.00 ns, 12.6167 us/op +WorkloadPilot 10: 11 op, 132291.00 ns, 12.0265 us/op +WorkloadPilot 11: 12 op, 92208.00 ns, 7.6840 us/op +WorkloadPilot 12: 13 op, 114958.00 ns, 8.8429 us/op +WorkloadPilot 13: 14 op, 101042.00 ns, 7.2173 us/op +WorkloadPilot 14: 15 op, 107167.00 ns, 7.1445 us/op +WorkloadPilot 15: 16 op, 121500.00 ns, 7.5938 us/op +WorkloadPilot 16: 32 op, 209042.00 ns, 6.5326 us/op +WorkloadPilot 17: 64 op, 421208.00 ns, 6.5814 us/op +WorkloadPilot 18: 128 op, 846291.00 ns, 6.6116 us/op +WorkloadPilot 19: 256 op, 1684666.00 ns, 6.5807 us/op +WorkloadPilot 20: 512 op, 3477208.00 ns, 6.7914 us/op +WorkloadPilot 21: 1024 op, 6973917.00 ns, 6.8105 us/op +WorkloadPilot 22: 2048 op, 14047875.00 ns, 6.8593 us/op +WorkloadPilot 23: 4096 op, 27163792.00 ns, 6.6318 us/op +WorkloadPilot 24: 8192 op, 54539667.00 ns, 6.6577 us/op +WorkloadPilot 25: 16384 op, 109565959.00 ns, 6.6874 us/op +WorkloadPilot 26: 32768 op, 249143917.00 ns, 7.6033 us/op +WorkloadPilot 27: 65536 op, 205214209.00 ns, 3.1313 us/op +WorkloadPilot 28: 131072 op, 280282541.00 ns, 2.1384 us/op +WorkloadPilot 29: 262144 op, 553053541.00 ns, 2.1097 us/op + +WorkloadWarmup 1: 262144 op, 558106334.00 ns, 2.1290 us/op +WorkloadWarmup 2: 262144 op, 552402083.00 ns, 2.1072 us/op +WorkloadWarmup 3: 262144 op, 557108292.00 ns, 2.1252 us/op + +// BeforeActualRun +WorkloadActual 1: 262144 op, 552485833.00 ns, 2.1076 us/op +WorkloadActual 2: 262144 op, 557535875.00 ns, 2.1268 us/op +WorkloadActual 3: 262144 op, 555799792.00 ns, 2.1202 us/op +WorkloadActual 4: 262144 op, 552434709.00 ns, 2.1074 us/op +WorkloadActual 5: 262144 op, 557385208.00 ns, 2.1263 us/op +WorkloadActual 6: 262144 op, 556614208.00 ns, 2.1233 us/op +WorkloadActual 7: 262144 op, 552271334.00 ns, 2.1067 us/op +WorkloadActual 8: 262144 op, 558348834.00 ns, 2.1299 us/op +WorkloadActual 9: 262144 op, 554299125.00 ns, 2.1145 us/op +WorkloadActual 10: 262144 op, 560411333.00 ns, 2.1378 us/op + +// AfterActualRun +WorkloadResult 1: 262144 op, 552485833.00 ns, 2.1076 us/op +WorkloadResult 2: 262144 op, 557535875.00 ns, 2.1268 us/op +WorkloadResult 3: 262144 op, 555799792.00 ns, 2.1202 us/op +WorkloadResult 4: 262144 op, 552434709.00 ns, 2.1074 us/op +WorkloadResult 5: 262144 op, 557385208.00 ns, 2.1263 us/op +WorkloadResult 6: 262144 op, 556614208.00 ns, 2.1233 us/op +WorkloadResult 7: 262144 op, 552271334.00 ns, 2.1067 us/op +WorkloadResult 8: 262144 op, 558348834.00 ns, 2.1299 us/op +WorkloadResult 9: 262144 op, 554299125.00 ns, 2.1145 us/op +WorkloadResult 10: 262144 op, 560411333.00 ns, 2.1378 us/op +// GC: 175 1 0 1098977712 262144 +// Threading: 0 0 262144 + +// AfterAll +// Benchmark Process 14425 has exited with code 0. + +Mean = 2.120 μs, StdErr = 0.003 μs (0.16%), N = 10, StdDev = 0.011 μs +Min = 2.107 μs, Q1 = 2.109 μs, Median = 2.122 μs, Q3 = 2.127 μs, Max = 2.138 μs +IQR = 0.017 μs, LowerFence = 2.083 μs, UpperFence = 2.153 μs +ConfidenceInterval = [2.104 μs; 2.136 μs] (CI 99.9%), Margin = 0.016 μs (0.76% of Mean) +Skewness = 0.05, Kurtosis = 1.48, MValue = 2 + +// ** Remained 6 (60,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:03 (0h 1m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_LargeJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 4 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-RUUBDF(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 190541.00 ns, 190.5410 us/op +2026-01-13 21:02:52.140 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 37636916.00 ns, 37.6369 ms/op + +WorkloadPilot 1: 2 op, 219000.00 ns, 109.5000 us/op +WorkloadPilot 2: 3 op, 253625.00 ns, 84.5417 us/op +WorkloadPilot 3: 4 op, 974083.00 ns, 243.5208 us/op +WorkloadPilot 4: 5 op, 400500.00 ns, 80.1000 us/op +WorkloadPilot 5: 6 op, 475834.00 ns, 79.3057 us/op +WorkloadPilot 6: 7 op, 537917.00 ns, 76.8453 us/op +WorkloadPilot 7: 8 op, 585292.00 ns, 73.1615 us/op +WorkloadPilot 8: 9 op, 678750.00 ns, 75.4167 us/op +WorkloadPilot 9: 10 op, 738875.00 ns, 73.8875 us/op +WorkloadPilot 10: 11 op, 917000.00 ns, 83.3636 us/op +WorkloadPilot 11: 12 op, 959375.00 ns, 79.9479 us/op +WorkloadPilot 12: 13 op, 963166.00 ns, 74.0897 us/op +WorkloadPilot 13: 14 op, 1038000.00 ns, 74.1429 us/op +WorkloadPilot 14: 15 op, 1190125.00 ns, 79.3417 us/op +WorkloadPilot 15: 16 op, 1221542.00 ns, 76.3464 us/op +WorkloadPilot 16: 32 op, 2490708.00 ns, 77.8346 us/op +WorkloadPilot 17: 64 op, 4916541.00 ns, 76.8210 us/op +WorkloadPilot 18: 128 op, 9704167.00 ns, 75.8138 us/op +WorkloadPilot 19: 256 op, 20003042.00 ns, 78.1369 us/op +WorkloadPilot 20: 512 op, 36367792.00 ns, 71.0308 us/op +WorkloadPilot 21: 1024 op, 77198416.00 ns, 75.3891 us/op +WorkloadPilot 22: 2048 op, 167672542.00 ns, 81.8714 us/op +WorkloadPilot 23: 4096 op, 227040125.00 ns, 55.4297 us/op +WorkloadPilot 24: 8192 op, 224780167.00 ns, 27.4390 us/op +WorkloadPilot 25: 16384 op, 397231583.00 ns, 24.2451 us/op +WorkloadPilot 26: 32768 op, 804610708.00 ns, 24.5548 us/op + +WorkloadWarmup 1: 32768 op, 831370208.00 ns, 25.3714 us/op +WorkloadWarmup 2: 32768 op, 844876958.00 ns, 25.7836 us/op +WorkloadWarmup 3: 32768 op, 822356209.00 ns, 25.0963 us/op + +// BeforeActualRun +WorkloadActual 1: 32768 op, 820540750.00 ns, 25.0409 us/op +WorkloadActual 2: 32768 op, 819454083.00 ns, 25.0078 us/op +WorkloadActual 3: 32768 op, 818789167.00 ns, 24.9875 us/op +WorkloadActual 4: 32768 op, 821731375.00 ns, 25.0773 us/op +WorkloadActual 5: 32768 op, 803282875.00 ns, 24.5142 us/op +WorkloadActual 6: 32768 op, 820004833.00 ns, 25.0246 us/op +WorkloadActual 7: 32768 op, 813126542.00 ns, 24.8147 us/op +WorkloadActual 8: 32768 op, 804031125.00 ns, 24.5371 us/op +WorkloadActual 9: 32768 op, 801119333.00 ns, 24.4482 us/op +WorkloadActual 10: 32768 op, 806195041.00 ns, 24.6031 us/op + +// AfterActualRun +WorkloadResult 1: 32768 op, 820540750.00 ns, 25.0409 us/op +WorkloadResult 2: 32768 op, 819454083.00 ns, 25.0078 us/op +WorkloadResult 3: 32768 op, 818789167.00 ns, 24.9875 us/op +WorkloadResult 4: 32768 op, 821731375.00 ns, 25.0773 us/op +WorkloadResult 5: 32768 op, 803282875.00 ns, 24.5142 us/op +WorkloadResult 6: 32768 op, 820004833.00 ns, 25.0246 us/op +WorkloadResult 7: 32768 op, 813126542.00 ns, 24.8147 us/op +WorkloadResult 8: 32768 op, 804031125.00 ns, 24.5371 us/op +WorkloadResult 9: 32768 op, 801119333.00 ns, 24.4482 us/op +WorkloadResult 10: 32768 op, 806195041.00 ns, 24.6031 us/op +// GC: 265 29 0 1671535200 32768 +// Threading: 0 0 32768 + +// AfterAll +// Benchmark Process 14429 has exited with code 0. + +Mean = 24.806 μs, StdErr = 0.080 μs (0.32%), N = 10, StdDev = 0.253 μs +Min = 24.448 μs, Q1 = 24.554 μs, Median = 24.901 μs, Q3 = 25.020 μs, Max = 25.077 μs +IQR = 0.467 μs, LowerFence = 23.853 μs, UpperFence = 25.721 μs +ConfidenceInterval = [24.423 μs; 25.188 μs] (CI 99.9%), Margin = 0.383 μs (1.54% of Mean) +Skewness = -0.25, Kurtosis = 1.07, MValue = 2 + +// ** Remained 5 (50,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_LargeJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 5 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-EMWTOF(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 180000.00 ns, 180.0000 us/op +2026-01-13 21:03:05.815 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 39358875.00 ns, 39.3589 ms/op + +WorkloadPilot 1: 2 op, 227916.00 ns, 113.9580 us/op +WorkloadPilot 2: 3 op, 262583.00 ns, 87.5277 us/op +WorkloadPilot 3: 4 op, 936375.00 ns, 234.0938 us/op +WorkloadPilot 4: 5 op, 462959.00 ns, 92.5918 us/op +WorkloadPilot 5: 6 op, 532750.00 ns, 88.7917 us/op +WorkloadPilot 6: 7 op, 563000.00 ns, 80.4286 us/op +WorkloadPilot 7: 8 op, 721459.00 ns, 90.1824 us/op +WorkloadPilot 8: 9 op, 720166.00 ns, 80.0184 us/op +WorkloadPilot 9: 10 op, 777375.00 ns, 77.7375 us/op +WorkloadPilot 10: 11 op, 834125.00 ns, 75.8295 us/op +WorkloadPilot 11: 12 op, 904500.00 ns, 75.3750 us/op +WorkloadPilot 12: 13 op, 1018042.00 ns, 78.3109 us/op +WorkloadPilot 13: 14 op, 1042584.00 ns, 74.4703 us/op +WorkloadPilot 14: 15 op, 1158875.00 ns, 77.2583 us/op +WorkloadPilot 15: 16 op, 1276708.00 ns, 79.7943 us/op +WorkloadPilot 16: 32 op, 2690000.00 ns, 84.0625 us/op +WorkloadPilot 17: 64 op, 4811833.00 ns, 75.1849 us/op +WorkloadPilot 18: 128 op, 10315709.00 ns, 80.5915 us/op +WorkloadPilot 19: 256 op, 19797708.00 ns, 77.3348 us/op +WorkloadPilot 20: 512 op, 39185500.00 ns, 76.5342 us/op +WorkloadPilot 21: 1024 op, 81426917.00 ns, 79.5185 us/op +WorkloadPilot 22: 2048 op, 158136167.00 ns, 77.2149 us/op +WorkloadPilot 23: 4096 op, 220819958.00 ns, 53.9111 us/op +WorkloadPilot 24: 8192 op, 226704542.00 ns, 27.6739 us/op +WorkloadPilot 25: 16384 op, 416678667.00 ns, 25.4320 us/op +WorkloadPilot 26: 32768 op, 800683375.00 ns, 24.4349 us/op + +WorkloadWarmup 1: 32768 op, 820395875.00 ns, 25.0365 us/op +WorkloadWarmup 2: 32768 op, 830884250.00 ns, 25.3566 us/op +WorkloadWarmup 3: 32768 op, 818644125.00 ns, 24.9830 us/op + +// BeforeActualRun +WorkloadActual 1: 32768 op, 803533375.00 ns, 24.5219 us/op +WorkloadActual 2: 32768 op, 822943375.00 ns, 25.1142 us/op +WorkloadActual 3: 32768 op, 799131333.00 ns, 24.3876 us/op +WorkloadActual 4: 32768 op, 822342375.00 ns, 25.0959 us/op +WorkloadActual 5: 32768 op, 805227084.00 ns, 24.5736 us/op +WorkloadActual 6: 32768 op, 822269542.00 ns, 25.0937 us/op +WorkloadActual 7: 32768 op, 803784292.00 ns, 24.5295 us/op +WorkloadActual 8: 32768 op, 824785584.00 ns, 25.1705 us/op +WorkloadActual 9: 32768 op, 821711417.00 ns, 25.0766 us/op +WorkloadActual 10: 32768 op, 818734416.00 ns, 24.9858 us/op + +// AfterActualRun +WorkloadResult 1: 32768 op, 803533375.00 ns, 24.5219 us/op +WorkloadResult 2: 32768 op, 822943375.00 ns, 25.1142 us/op +WorkloadResult 3: 32768 op, 799131333.00 ns, 24.3876 us/op +WorkloadResult 4: 32768 op, 822342375.00 ns, 25.0959 us/op +WorkloadResult 5: 32768 op, 805227084.00 ns, 24.5736 us/op +WorkloadResult 6: 32768 op, 822269542.00 ns, 25.0937 us/op +WorkloadResult 7: 32768 op, 803784292.00 ns, 24.5295 us/op +WorkloadResult 8: 32768 op, 824785584.00 ns, 25.1705 us/op +WorkloadResult 9: 32768 op, 821711417.00 ns, 25.0766 us/op +WorkloadResult 10: 32768 op, 818734416.00 ns, 24.9858 us/op +// GC: 265 29 0 1671535488 32768 +// Threading: 0 0 32768 + +// AfterAll +// Benchmark Process 14430 has exited with code 0. + +Mean = 24.855 μs, StdErr = 0.098 μs (0.39%), N = 10, StdDev = 0.310 μs +Min = 24.388 μs, Q1 = 24.541 μs, Median = 25.031 μs, Q3 = 25.095 μs, Max = 25.170 μs +IQR = 0.555 μs, LowerFence = 23.708 μs, UpperFence = 25.928 μs +ConfidenceInterval = [24.387 μs; 25.323 μs] (CI 99.9%), Margin = 0.468 μs (1.88% of Mean) +Skewness = -0.36, Kurtosis = 1.1, MValue = 2 + +// ** Remained 4 (40,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_Base64 --job "IterationCount=10, WarmupCount=3" --benchmarkId 6 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-XWBJWR(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 217958.00 ns, 217.9580 us/op +2026-01-13 21:03:19.497 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 38024000.00 ns, 38.0240 ms/op + +WorkloadPilot 1: 2 op, 99458.00 ns, 49.7290 us/op +WorkloadPilot 2: 3 op, 25041.00 ns, 8.3470 us/op +WorkloadPilot 3: 4 op, 24209.00 ns, 6.0523 us/op +WorkloadPilot 4: 5 op, 28250.00 ns, 5.6500 us/op +WorkloadPilot 5: 6 op, 49834.00 ns, 8.3057 us/op +WorkloadPilot 6: 7 op, 38875.00 ns, 5.5536 us/op +WorkloadPilot 7: 8 op, 46792.00 ns, 5.8490 us/op +WorkloadPilot 8: 9 op, 47833.00 ns, 5.3148 us/op +WorkloadPilot 9: 10 op, 48417.00 ns, 4.8417 us/op +WorkloadPilot 10: 11 op, 53292.00 ns, 4.8447 us/op +WorkloadPilot 11: 12 op, 57500.00 ns, 4.7917 us/op +WorkloadPilot 12: 13 op, 65667.00 ns, 5.0513 us/op +WorkloadPilot 13: 14 op, 66875.00 ns, 4.7768 us/op +WorkloadPilot 14: 15 op, 69333.00 ns, 4.6222 us/op +WorkloadPilot 15: 16 op, 73333.00 ns, 4.5833 us/op +WorkloadPilot 16: 32 op, 151250.00 ns, 4.7266 us/op +WorkloadPilot 17: 64 op, 273625.00 ns, 4.2754 us/op +WorkloadPilot 18: 128 op, 537250.00 ns, 4.1973 us/op +WorkloadPilot 19: 256 op, 1153833.00 ns, 4.5072 us/op +WorkloadPilot 20: 512 op, 2224334.00 ns, 4.3444 us/op +WorkloadPilot 21: 1024 op, 4615166.00 ns, 4.5070 us/op +WorkloadPilot 22: 2048 op, 9841834.00 ns, 4.8056 us/op +WorkloadPilot 23: 4096 op, 17922625.00 ns, 4.3756 us/op +WorkloadPilot 24: 8192 op, 35693625.00 ns, 4.3571 us/op +WorkloadPilot 25: 16384 op, 70213083.00 ns, 4.2855 us/op +WorkloadPilot 26: 32768 op, 163380125.00 ns, 4.9860 us/op +WorkloadPilot 27: 65536 op, 300504209.00 ns, 4.5853 us/op +WorkloadPilot 28: 131072 op, 197663417.00 ns, 1.5081 us/op +WorkloadPilot 29: 262144 op, 391312375.00 ns, 1.4927 us/op +WorkloadPilot 30: 524288 op, 787606334.00 ns, 1.5022 us/op + +WorkloadWarmup 1: 524288 op, 782435416.00 ns, 1.4924 us/op +WorkloadWarmup 2: 524288 op, 778143875.00 ns, 1.4842 us/op +WorkloadWarmup 3: 524288 op, 784058916.00 ns, 1.4955 us/op + +// BeforeActualRun +WorkloadActual 1: 524288 op, 788792625.00 ns, 1.5045 us/op +WorkloadActual 2: 524288 op, 781723959.00 ns, 1.4910 us/op +WorkloadActual 3: 524288 op, 781277584.00 ns, 1.4902 us/op +WorkloadActual 4: 524288 op, 785909416.00 ns, 1.4990 us/op +WorkloadActual 5: 524288 op, 781774167.00 ns, 1.4911 us/op +WorkloadActual 6: 524288 op, 784133000.00 ns, 1.4956 us/op +WorkloadActual 7: 524288 op, 786714083.00 ns, 1.5005 us/op +WorkloadActual 8: 524288 op, 781269500.00 ns, 1.4902 us/op +WorkloadActual 9: 524288 op, 786479458.00 ns, 1.5001 us/op +WorkloadActual 10: 524288 op, 785444625.00 ns, 1.4981 us/op + +// AfterActualRun +WorkloadResult 1: 524288 op, 788792625.00 ns, 1.5045 us/op +WorkloadResult 2: 524288 op, 781723959.00 ns, 1.4910 us/op +WorkloadResult 3: 524288 op, 781277584.00 ns, 1.4902 us/op +WorkloadResult 4: 524288 op, 785909416.00 ns, 1.4990 us/op +WorkloadResult 5: 524288 op, 781774167.00 ns, 1.4911 us/op +WorkloadResult 6: 524288 op, 784133000.00 ns, 1.4956 us/op +WorkloadResult 7: 524288 op, 786714083.00 ns, 1.5005 us/op +WorkloadResult 8: 524288 op, 781269500.00 ns, 1.4902 us/op +WorkloadResult 9: 524288 op, 786479458.00 ns, 1.5001 us/op +WorkloadResult 10: 524288 op, 785444625.00 ns, 1.4981 us/op +// GC: 294 2 0 1845610472 524288 +// Threading: 0 0 524288 + +// AfterAll +// Benchmark Process 14434 has exited with code 0. + +Mean = 1.496 μs, StdErr = 0.002 μs (0.11%), N = 10, StdDev = 0.005 μs +Min = 1.490 μs, Q1 = 1.491 μs, Median = 1.497 μs, Q3 = 1.500 μs, Max = 1.505 μs +IQR = 0.009 μs, LowerFence = 1.478 μs, UpperFence = 1.513 μs +ConfidenceInterval = [1.488 μs; 1.504 μs] (CI 99.9%), Margin = 0.008 μs (0.52% of Mean) +Skewness = 0.11, Kurtosis = 1.34, MValue = 2 + +// ** Remained 3 (30,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_Base64 --job "IterationCount=10, WarmupCount=3" --benchmarkId 7 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-UWMYUH(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 166333.00 ns, 166.3330 us/op +2026-01-13 21:03:32.693 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 40250500.00 ns, 40.2505 ms/op + +WorkloadPilot 1: 2 op, 112000.00 ns, 56.0000 us/op +WorkloadPilot 2: 3 op, 45041.00 ns, 15.0137 us/op +WorkloadPilot 3: 4 op, 79417.00 ns, 19.8543 us/op +WorkloadPilot 4: 5 op, 48667.00 ns, 9.7334 us/op +WorkloadPilot 5: 6 op, 61042.00 ns, 10.1737 us/op +WorkloadPilot 6: 7 op, 50791.00 ns, 7.2559 us/op +WorkloadPilot 7: 8 op, 45375.00 ns, 5.6719 us/op +WorkloadPilot 8: 9 op, 47542.00 ns, 5.2824 us/op +WorkloadPilot 9: 10 op, 59750.00 ns, 5.9750 us/op +WorkloadPilot 10: 11 op, 73417.00 ns, 6.6743 us/op +WorkloadPilot 11: 12 op, 61750.00 ns, 5.1458 us/op +WorkloadPilot 12: 13 op, 64708.00 ns, 4.9775 us/op +WorkloadPilot 13: 14 op, 73667.00 ns, 5.2619 us/op +WorkloadPilot 14: 15 op, 78583.00 ns, 5.2389 us/op +WorkloadPilot 15: 16 op, 110542.00 ns, 6.9089 us/op +WorkloadPilot 16: 32 op, 198542.00 ns, 6.2044 us/op +WorkloadPilot 17: 64 op, 295792.00 ns, 4.6218 us/op +WorkloadPilot 18: 128 op, 568500.00 ns, 4.4414 us/op +WorkloadPilot 19: 256 op, 1138500.00 ns, 4.4473 us/op +WorkloadPilot 20: 512 op, 2311000.00 ns, 4.5137 us/op +WorkloadPilot 21: 1024 op, 4896791.00 ns, 4.7820 us/op +WorkloadPilot 22: 2048 op, 9847083.00 ns, 4.8081 us/op +WorkloadPilot 23: 4096 op, 18525000.00 ns, 4.5227 us/op +WorkloadPilot 24: 8192 op, 38761083.00 ns, 4.7316 us/op +WorkloadPilot 25: 16384 op, 79141917.00 ns, 4.8304 us/op +WorkloadPilot 26: 32768 op, 161911583.00 ns, 4.9411 us/op +WorkloadPilot 27: 65536 op, 292665458.00 ns, 4.4657 us/op +WorkloadPilot 28: 131072 op, 203511334.00 ns, 1.5527 us/op +WorkloadPilot 29: 262144 op, 416155208.00 ns, 1.5875 us/op +WorkloadPilot 30: 524288 op, 817333167.00 ns, 1.5589 us/op + +WorkloadWarmup 1: 524288 op, 807847209.00 ns, 1.5408 us/op +WorkloadWarmup 2: 524288 op, 818599791.00 ns, 1.5614 us/op +WorkloadWarmup 3: 524288 op, 813577083.00 ns, 1.5518 us/op + +// BeforeActualRun +WorkloadActual 1: 524288 op, 804349833.00 ns, 1.5342 us/op +WorkloadActual 2: 524288 op, 811891916.00 ns, 1.5486 us/op +WorkloadActual 3: 524288 op, 811734125.00 ns, 1.5483 us/op +WorkloadActual 4: 524288 op, 809661375.00 ns, 1.5443 us/op +WorkloadActual 5: 524288 op, 811192750.00 ns, 1.5472 us/op +WorkloadActual 6: 524288 op, 812078416.00 ns, 1.5489 us/op +WorkloadActual 7: 524288 op, 805105042.00 ns, 1.5356 us/op +WorkloadActual 8: 524288 op, 810018667.00 ns, 1.5450 us/op +WorkloadActual 9: 524288 op, 810251042.00 ns, 1.5454 us/op +WorkloadActual 10: 524288 op, 807480875.00 ns, 1.5401 us/op + +// AfterActualRun +WorkloadResult 1: 524288 op, 804349833.00 ns, 1.5342 us/op +WorkloadResult 2: 524288 op, 811891916.00 ns, 1.5486 us/op +WorkloadResult 3: 524288 op, 811734125.00 ns, 1.5483 us/op +WorkloadResult 4: 524288 op, 809661375.00 ns, 1.5443 us/op +WorkloadResult 5: 524288 op, 811192750.00 ns, 1.5472 us/op +WorkloadResult 6: 524288 op, 812078416.00 ns, 1.5489 us/op +WorkloadResult 7: 524288 op, 805105042.00 ns, 1.5356 us/op +WorkloadResult 8: 524288 op, 810018667.00 ns, 1.5450 us/op +WorkloadResult 9: 524288 op, 810251042.00 ns, 1.5454 us/op +WorkloadResult 10: 524288 op, 807480875.00 ns, 1.5401 us/op +// GC: 294 2 0 1845609464 524288 +// Threading: 0 0 524288 + +// AfterAll +// Benchmark Process 14441 has exited with code 0. + +Mean = 1.544 μs, StdErr = 0.002 μs (0.11%), N = 10, StdDev = 0.005 μs +Min = 1.534 μs, Q1 = 1.541 μs, Median = 1.545 μs, Q3 = 1.548 μs, Max = 1.549 μs +IQR = 0.007 μs, LowerFence = 1.531 μs, UpperFence = 1.558 μs +ConfidenceInterval = [1.536 μs; 1.552 μs] (CI 99.9%), Margin = 0.008 μs (0.52% of Mean) +Skewness = -0.71, Kurtosis = 1.81, MValue = 2 + +// ** Remained 2 (20,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_Xml --job "IterationCount=10, WarmupCount=3" --benchmarkId 8 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-MYUNQK(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 169458.00 ns, 169.4580 us/op +2026-01-13 21:03:46.338 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 37570750.00 ns, 37.5708 ms/op + +WorkloadPilot 1: 2 op, 78916.00 ns, 39.4580 us/op +WorkloadPilot 2: 3 op, 26875.00 ns, 8.9583 us/op +WorkloadPilot 3: 4 op, 42542.00 ns, 10.6355 us/op +WorkloadPilot 4: 5 op, 33250.00 ns, 6.6500 us/op +WorkloadPilot 5: 6 op, 34584.00 ns, 5.7640 us/op +WorkloadPilot 6: 7 op, 55583.00 ns, 7.9404 us/op +WorkloadPilot 7: 8 op, 108000.00 ns, 13.5000 us/op +WorkloadPilot 8: 9 op, 57042.00 ns, 6.3380 us/op +WorkloadPilot 9: 10 op, 118917.00 ns, 11.8917 us/op +WorkloadPilot 10: 11 op, 85667.00 ns, 7.7879 us/op +WorkloadPilot 11: 12 op, 64625.00 ns, 5.3854 us/op +WorkloadPilot 12: 13 op, 65917.00 ns, 5.0705 us/op +WorkloadPilot 13: 14 op, 70291.00 ns, 5.0208 us/op +WorkloadPilot 14: 15 op, 82000.00 ns, 5.4667 us/op +WorkloadPilot 15: 16 op, 79416.00 ns, 4.9635 us/op +WorkloadPilot 16: 32 op, 151458.00 ns, 4.7331 us/op +WorkloadPilot 17: 64 op, 295666.00 ns, 4.6198 us/op +WorkloadPilot 18: 128 op, 584083.00 ns, 4.5631 us/op +WorkloadPilot 19: 256 op, 1180750.00 ns, 4.6123 us/op +WorkloadPilot 20: 512 op, 2463625.00 ns, 4.8118 us/op +WorkloadPilot 21: 1024 op, 5088541.00 ns, 4.9693 us/op +WorkloadPilot 22: 2048 op, 10323584.00 ns, 5.0408 us/op +WorkloadPilot 23: 4096 op, 19149042.00 ns, 4.6751 us/op +WorkloadPilot 24: 8192 op, 38635208.00 ns, 4.7162 us/op +WorkloadPilot 25: 16384 op, 83278750.00 ns, 5.0829 us/op +WorkloadPilot 26: 32768 op, 188011708.00 ns, 5.7377 us/op +WorkloadPilot 27: 65536 op, 289038917.00 ns, 4.4104 us/op +WorkloadPilot 28: 131072 op, 213064542.00 ns, 1.6256 us/op +WorkloadPilot 29: 262144 op, 431157333.00 ns, 1.6447 us/op +WorkloadPilot 30: 524288 op, 846662500.00 ns, 1.6149 us/op + +WorkloadWarmup 1: 524288 op, 850038000.00 ns, 1.6213 us/op +WorkloadWarmup 2: 524288 op, 852605500.00 ns, 1.6262 us/op +WorkloadWarmup 3: 524288 op, 849160917.00 ns, 1.6196 us/op + +// BeforeActualRun +WorkloadActual 1: 524288 op, 847693250.00 ns, 1.6168 us/op +WorkloadActual 2: 524288 op, 849947833.00 ns, 1.6211 us/op +WorkloadActual 3: 524288 op, 842952875.00 ns, 1.6078 us/op +WorkloadActual 4: 524288 op, 849205667.00 ns, 1.6197 us/op +WorkloadActual 5: 524288 op, 847955083.00 ns, 1.6173 us/op +WorkloadActual 6: 524288 op, 842458084.00 ns, 1.6069 us/op +WorkloadActual 7: 524288 op, 850041542.00 ns, 1.6213 us/op +WorkloadActual 8: 524288 op, 848452542.00 ns, 1.6183 us/op +WorkloadActual 9: 524288 op, 847344417.00 ns, 1.6162 us/op +WorkloadActual 10: 524288 op, 848552458.00 ns, 1.6185 us/op + +// AfterActualRun +WorkloadResult 1: 524288 op, 847693250.00 ns, 1.6168 us/op +WorkloadResult 2: 524288 op, 849947833.00 ns, 1.6211 us/op +WorkloadResult 3: 524288 op, 842952875.00 ns, 1.6078 us/op +WorkloadResult 4: 524288 op, 849205667.00 ns, 1.6197 us/op +WorkloadResult 5: 524288 op, 847955083.00 ns, 1.6173 us/op +WorkloadResult 6: 524288 op, 842458084.00 ns, 1.6069 us/op +WorkloadResult 7: 524288 op, 850041542.00 ns, 1.6213 us/op +WorkloadResult 8: 524288 op, 848452542.00 ns, 1.6183 us/op +WorkloadResult 9: 524288 op, 847344417.00 ns, 1.6162 us/op +WorkloadResult 10: 524288 op, 848552458.00 ns, 1.6185 us/op +// GC: 292 2 0 1837221080 524288 +// Threading: 0 0 524288 + +// AfterAll +// Benchmark Process 14445 has exited with code 0. + +Mean = 1.616 μs, StdErr = 0.002 μs (0.10%), N = 10, StdDev = 0.005 μs +Min = 1.607 μs, Q1 = 1.616 μs, Median = 1.618 μs, Q3 = 1.619 μs, Max = 1.621 μs +IQR = 0.003 μs, LowerFence = 1.612 μs, UpperFence = 1.624 μs +ConfidenceInterval = [1.609 μs; 1.624 μs] (CI 99.9%), Margin = 0.008 μs (0.47% of Mean) +Skewness = -0.94, Kurtosis = 2.26, MValue = 2 + +// ** Remained 1 (10,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** +// ************************** +// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_Xml --job "IterationCount=10, WarmupCount=3" --benchmarkId 9 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.14.0 +// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD +// GC=Concurrent Workstation +// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 +// Job: Job-MEUEWE(IterationCount=10, WarmupCount=3) + +OverheadJitting 1: 1 op, 174958.00 ns, 174.9580 us/op +2026-01-13 21:04:00.597 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info +WorkloadJitting 1: 1 op, 37754750.00 ns, 37.7548 ms/op + +WorkloadPilot 1: 2 op, 101584.00 ns, 50.7920 us/op +WorkloadPilot 2: 3 op, 49208.00 ns, 16.4027 us/op +WorkloadPilot 3: 4 op, 46291.00 ns, 11.5728 us/op +WorkloadPilot 4: 5 op, 34583.00 ns, 6.9166 us/op +WorkloadPilot 5: 6 op, 36750.00 ns, 6.1250 us/op +WorkloadPilot 6: 7 op, 40833.00 ns, 5.8333 us/op +WorkloadPilot 7: 8 op, 48292.00 ns, 6.0365 us/op +WorkloadPilot 8: 9 op, 95875.00 ns, 10.6528 us/op +WorkloadPilot 9: 10 op, 73167.00 ns, 7.3167 us/op +WorkloadPilot 10: 11 op, 68375.00 ns, 6.2159 us/op +WorkloadPilot 11: 12 op, 66250.00 ns, 5.5208 us/op +WorkloadPilot 12: 13 op, 75667.00 ns, 5.8205 us/op +WorkloadPilot 13: 14 op, 78708.00 ns, 5.6220 us/op +WorkloadPilot 14: 15 op, 81959.00 ns, 5.4639 us/op +WorkloadPilot 15: 16 op, 89083.00 ns, 5.5677 us/op +WorkloadPilot 16: 32 op, 180542.00 ns, 5.6419 us/op +WorkloadPilot 17: 64 op, 337708.00 ns, 5.2767 us/op +WorkloadPilot 18: 128 op, 657875.00 ns, 5.1396 us/op +WorkloadPilot 19: 256 op, 1275334.00 ns, 4.9818 us/op +WorkloadPilot 20: 512 op, 2588084.00 ns, 5.0549 us/op +WorkloadPilot 21: 1024 op, 5287709.00 ns, 5.1638 us/op +WorkloadPilot 22: 2048 op, 11100625.00 ns, 5.4202 us/op +WorkloadPilot 23: 4096 op, 21008125.00 ns, 5.1289 us/op +WorkloadPilot 24: 8192 op, 40818042.00 ns, 4.9827 us/op +WorkloadPilot 25: 16384 op, 86011625.00 ns, 5.2497 us/op +WorkloadPilot 26: 32768 op, 204760708.00 ns, 6.2488 us/op +WorkloadPilot 27: 65536 op, 273337000.00 ns, 4.1708 us/op +WorkloadPilot 28: 131072 op, 224696916.00 ns, 1.7143 us/op +WorkloadPilot 29: 262144 op, 440820833.00 ns, 1.6816 us/op +WorkloadPilot 30: 524288 op, 882895083.00 ns, 1.6840 us/op + +WorkloadWarmup 1: 524288 op, 878292209.00 ns, 1.6752 us/op +WorkloadWarmup 2: 524288 op, 877136583.00 ns, 1.6730 us/op +WorkloadWarmup 3: 524288 op, 887537125.00 ns, 1.6928 us/op + +// BeforeActualRun +WorkloadActual 1: 524288 op, 888085417.00 ns, 1.6939 us/op +WorkloadActual 2: 524288 op, 877407125.00 ns, 1.6735 us/op +WorkloadActual 3: 524288 op, 880285084.00 ns, 1.6790 us/op +WorkloadActual 4: 524288 op, 880823375.00 ns, 1.6800 us/op +WorkloadActual 5: 524288 op, 874400500.00 ns, 1.6678 us/op +WorkloadActual 6: 524288 op, 878560375.00 ns, 1.6757 us/op +WorkloadActual 7: 524288 op, 884286250.00 ns, 1.6866 us/op +WorkloadActual 8: 524288 op, 876493500.00 ns, 1.6718 us/op +WorkloadActual 9: 524288 op, 908325792.00 ns, 1.7325 us/op +WorkloadActual 10: 524288 op, 886055334.00 ns, 1.6900 us/op + +// AfterActualRun +WorkloadResult 1: 524288 op, 888085417.00 ns, 1.6939 us/op +WorkloadResult 2: 524288 op, 877407125.00 ns, 1.6735 us/op +WorkloadResult 3: 524288 op, 880285084.00 ns, 1.6790 us/op +WorkloadResult 4: 524288 op, 880823375.00 ns, 1.6800 us/op +WorkloadResult 5: 524288 op, 874400500.00 ns, 1.6678 us/op +WorkloadResult 6: 524288 op, 878560375.00 ns, 1.6757 us/op +WorkloadResult 7: 524288 op, 884286250.00 ns, 1.6866 us/op +WorkloadResult 8: 524288 op, 876493500.00 ns, 1.6718 us/op +WorkloadResult 9: 524288 op, 886055334.00 ns, 1.6900 us/op +// GC: 292 2 0 1837221080 524288 +// Threading: 0 0 524288 + +// AfterAll +// Benchmark Process 14449 has exited with code 0. + +Mean = 1.680 μs, StdErr = 0.003 μs (0.17%), N = 9, StdDev = 0.009 μs +Min = 1.668 μs, Q1 = 1.674 μs, Median = 1.679 μs, Q3 = 1.687 μs, Max = 1.694 μs +IQR = 0.013 μs, LowerFence = 1.654 μs, UpperFence = 1.706 μs +ConfidenceInterval = [1.665 μs; 1.695 μs] (CI 99.9%), Margin = 0.015 μs (0.88% of Mean) +Skewness = 0.26, Kurtosis = 1.49, MValue = 2 + +// ** Remained 0 (0,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report.html + +// * Detailed results * +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 1.367 μs, StdErr = 0.002 μs (0.15%), N = 10, StdDev = 0.007 μs +Min = 1.355 μs, Q1 = 1.363 μs, Median = 1.369 μs, Q3 = 1.372 μs, Max = 1.374 μs +IQR = 0.008 μs, LowerFence = 1.351 μs, UpperFence = 1.384 μs +ConfidenceInterval = [1.357 μs; 1.377 μs] (CI 99.9%), Margin = 0.010 μs (0.72% of Mean) +Skewness = -0.6, Kurtosis = 1.73, MValue = 2 +-------------------- Histogram -------------------- +[1.351 μs ; 1.378 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 1.414 μs, StdErr = 0.002 μs (0.15%), N = 10, StdDev = 0.007 μs +Min = 1.405 μs, Q1 = 1.409 μs, Median = 1.416 μs, Q3 = 1.420 μs, Max = 1.422 μs +IQR = 0.011 μs, LowerFence = 1.392 μs, UpperFence = 1.436 μs +ConfidenceInterval = [1.404 μs; 1.424 μs] (CI 99.9%), Margin = 0.010 μs (0.72% of Mean) +Skewness = -0.17, Kurtosis = 1.14, MValue = 2 +-------------------- Histogram -------------------- +[1.401 μs ; 1.427 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 2.053 μs, StdErr = 0.002 μs (0.12%), N = 10, StdDev = 0.008 μs +Min = 2.038 μs, Q1 = 2.048 μs, Median = 2.054 μs, Q3 = 2.057 μs, Max = 2.066 μs +IQR = 0.009 μs, LowerFence = 2.035 μs, UpperFence = 2.070 μs +ConfidenceInterval = [2.041 μs; 2.065 μs] (CI 99.9%), Margin = 0.012 μs (0.57% of Mean) +Skewness = -0.18, Kurtosis = 2.21, MValue = 2 +-------------------- Histogram -------------------- +[2.033 μs ; 2.071 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 2.120 μs, StdErr = 0.003 μs (0.16%), N = 10, StdDev = 0.011 μs +Min = 2.107 μs, Q1 = 2.109 μs, Median = 2.122 μs, Q3 = 2.127 μs, Max = 2.138 μs +IQR = 0.017 μs, LowerFence = 2.083 μs, UpperFence = 2.153 μs +ConfidenceInterval = [2.104 μs; 2.136 μs] (CI 99.9%), Margin = 0.016 μs (0.76% of Mean) +Skewness = 0.05, Kurtosis = 1.48, MValue = 2 +-------------------- Histogram -------------------- +[2.104 μs ; 2.144 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 24.806 μs, StdErr = 0.080 μs (0.32%), N = 10, StdDev = 0.253 μs +Min = 24.448 μs, Q1 = 24.554 μs, Median = 24.901 μs, Q3 = 25.020 μs, Max = 25.077 μs +IQR = 0.467 μs, LowerFence = 23.853 μs, UpperFence = 25.721 μs +ConfidenceInterval = [24.423 μs; 25.188 μs] (CI 99.9%), Margin = 0.383 μs (1.54% of Mean) +Skewness = -0.25, Kurtosis = 1.07, MValue = 2 +-------------------- Histogram -------------------- +[24.294 μs ; 25.195 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 24.855 μs, StdErr = 0.098 μs (0.39%), N = 10, StdDev = 0.310 μs +Min = 24.388 μs, Q1 = 24.541 μs, Median = 25.031 μs, Q3 = 25.095 μs, Max = 25.170 μs +IQR = 0.555 μs, LowerFence = 23.708 μs, UpperFence = 25.928 μs +ConfidenceInterval = [24.387 μs; 25.323 μs] (CI 99.9%), Margin = 0.468 μs (1.88% of Mean) +Skewness = -0.36, Kurtosis = 1.1, MValue = 2 +-------------------- Histogram -------------------- +[24.199 μs ; 24.827 μs) | @@@@ +[24.827 μs ; 25.359 μs) | @@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 1.496 μs, StdErr = 0.002 μs (0.11%), N = 10, StdDev = 0.005 μs +Min = 1.490 μs, Q1 = 1.491 μs, Median = 1.497 μs, Q3 = 1.500 μs, Max = 1.505 μs +IQR = 0.009 μs, LowerFence = 1.478 μs, UpperFence = 1.513 μs +ConfidenceInterval = [1.488 μs; 1.504 μs] (CI 99.9%), Margin = 0.008 μs (0.52% of Mean) +Skewness = 0.11, Kurtosis = 1.34, MValue = 2 +-------------------- Histogram -------------------- +[1.487 μs ; 1.508 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 1.544 μs, StdErr = 0.002 μs (0.11%), N = 10, StdDev = 0.005 μs +Min = 1.534 μs, Q1 = 1.541 μs, Median = 1.545 μs, Q3 = 1.548 μs, Max = 1.549 μs +IQR = 0.007 μs, LowerFence = 1.531 μs, UpperFence = 1.558 μs +ConfidenceInterval = [1.536 μs; 1.552 μs] (CI 99.9%), Margin = 0.008 μs (0.52% of Mean) +Skewness = -0.71, Kurtosis = 1.81, MValue = 2 +-------------------- Histogram -------------------- +[1.531 μs ; 1.552 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 1.616 μs, StdErr = 0.002 μs (0.10%), N = 10, StdDev = 0.005 μs +Min = 1.607 μs, Q1 = 1.616 μs, Median = 1.618 μs, Q3 = 1.619 μs, Max = 1.621 μs +IQR = 0.003 μs, LowerFence = 1.612 μs, UpperFence = 1.624 μs +ConfidenceInterval = [1.609 μs; 1.624 μs] (CI 99.9%), Margin = 0.008 μs (0.47% of Mean) +Skewness = -0.94, Kurtosis = 2.26, MValue = 2 +-------------------- Histogram -------------------- +[1.604 μs ; 1.624 μs) | @@@@@@@@@@ +--------------------------------------------------- + +CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) +Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation +Mean = 1.680 μs, StdErr = 0.003 μs (0.17%), N = 9, StdDev = 0.009 μs +Min = 1.668 μs, Q1 = 1.674 μs, Median = 1.679 μs, Q3 = 1.687 μs, Max = 1.694 μs +IQR = 0.013 μs, LowerFence = 1.654 μs, UpperFence = 1.706 μs +ConfidenceInterval = [1.665 μs; 1.695 μs] (CI 99.9%), Margin = 0.015 μs (0.88% of Mean) +Skewness = 0.26, Kurtosis = 1.49, MValue = 2 +-------------------- Histogram -------------------- +[1.662 μs ; 1.699 μs) | @@@@@@@@@ +--------------------------------------------------- + +// * Summary * + +BenchmarkDotNet v0.14.0, macOS 26.2 (25C56) [Darwin 25.2.0] +Apple M1 Ultra, 1 CPU, 20 logical and 20 physical cores +.NET SDK 10.0.101 + [Host] : .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD + Job-VESCTB : .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD + +IterationCount=10 WarmupCount=3 + +| Method | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Gen1 | Allocated | Alloc Ratio | +|------------------------------------------ |----------:|----------:|----------:|------:|--------:|-------:|-------:|----------:|------------:| +| 'Permissive mode - Small JSON payload' | 1.367 μs | 0.0099 μs | 0.0065 μs | 0.81 | 0.01 | 0.5283 | 0.0019 | 3.24 KB | 0.95 | +| 'Strict mode - Small JSON payload' | 1.414 μs | 0.0102 μs | 0.0067 μs | 0.84 | 0.01 | 0.5283 | 0.0019 | 3.24 KB | 0.95 | +| 'Permissive mode - Medium JSON payload' | 2.053 μs | 0.0117 μs | 0.0078 μs | 1.22 | 0.01 | 0.6676 | 0.0038 | 4.09 KB | 1.20 | +| 'Strict mode - Medium JSON payload' | 2.120 μs | 0.0162 μs | 0.0107 μs | 1.26 | 0.01 | 0.6676 | 0.0038 | 4.09 KB | 1.20 | +| 'Permissive mode - Large JSON payload' | 24.806 μs | 0.3828 μs | 0.2532 μs | 14.77 | 0.16 | 8.0872 | 0.8850 | 49.82 KB | 14.56 | +| 'Strict mode - Large JSON payload' | 24.855 μs | 0.4680 μs | 0.3096 μs | 14.80 | 0.19 | 8.0872 | 0.8850 | 49.82 KB | 14.56 | +| 'Permissive mode - Base64 binary payload' | 1.496 μs | 0.0078 μs | 0.0052 μs | 0.89 | 0.01 | 0.5608 | 0.0038 | 3.44 KB | 1.00 | +| 'Strict mode - Base64 binary payload' | 1.544 μs | 0.0081 μs | 0.0054 μs | 0.92 | 0.01 | 0.5608 | 0.0038 | 3.44 KB | 1.00 | +| 'Permissive mode - XML payload' | 1.616 μs | 0.0077 μs | 0.0051 μs | 0.96 | 0.01 | 0.5569 | 0.0038 | 3.42 KB | 1.00 | +| 'Strict mode - XML payload' | 1.680 μs | 0.0147 μs | 0.0088 μs | 1.00 | 0.01 | 0.5569 | 0.0038 | 3.42 KB | 1.00 | + +// * Hints * +Outliers + CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': IterationCount=10, WarmupCount=3 -> 2 outliers were detected (1.61 μs, 1.61 μs) + CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': IterationCount=10, WarmupCount=3 -> 1 outlier was removed (1.73 μs) + +// * Legends * + Mean : Arithmetic mean of all measurements + Error : Half of 99.9% confidence interval + StdDev : Standard deviation of all measurements + Ratio : Mean of the ratio distribution ([Current]/[Baseline]) + RatioSD : Standard deviation of the ratio distribution ([Current]/[Baseline]) + Gen0 : GC Generation 0 collects per 1000 operations + Gen1 : GC Generation 1 collects per 1000 operations + Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B) + Alloc Ratio : Allocated memory ratio distribution ([Current]/[Baseline]) + 1 μs : 1 Microsecond (0.000001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:02:06 (126.97 sec), executed benchmarks: 10 + +Global total time: 00:02:16 (136.08 sec), executed benchmarks: 10 +// * Artifacts cleanup * +Artifacts cleanup is finished From eba755df36f524e59193218fd79713a951cd7dec Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Thu, 15 Jan 2026 18:16:44 +0100 Subject: [PATCH 11/21] Update to latest Core with the new buffer writer API --- .../NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj | 2 +- .../NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj | 2 +- .../NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj | 2 +- .../NServiceBus.Envelope.CloudEvents.csproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj index bc816f5..b9cd128 100644 --- a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj @@ -18,7 +18,7 @@ - + diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj index dc39d42..cc253c9 100644 --- a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj index 6f05c7e..9539f86 100644 --- a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj index b4691af..2e026c9 100644 --- a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj +++ b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj @@ -7,7 +7,7 @@ - + From 4fde24deaa587164de50823bc71ec8efdc75d6aa Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Thu, 15 Jan 2026 18:17:55 +0100 Subject: [PATCH 12/21] Remove benchmarks from this branch We still have them on the `-with-benchmarks` branch --- ...elopeHandlerBenchmarks-20260113-183448.log | 5 - ...elopeHandlerBenchmarks-20260113-184728.log | 1064 ---------------- ...elopeHandlerBenchmarks-20260113-210159.log | 1078 ----------------- ...JsonStructuredEnvelopeHandlerBenchmarks.cs | 299 ----- .../FakeMeterFactory.cs | 23 - ...Bus.Envelope.CloudEvents.Benchmarks.csproj | 18 - .../Program.cs | 11 - .../README.md | 64 - 8 files changed, 2562 deletions(-) delete mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-183448.log delete mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-184728.log delete mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-210159.log delete mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/CloudEventJsonStructuredEnvelopeHandlerBenchmarks.cs delete mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/FakeMeterFactory.cs delete mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/NServiceBus.Envelope.CloudEvents.Benchmarks.csproj delete mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/Program.cs delete mode 100644 src/NServiceBus.Envelope.CloudEvents.Benchmarks/README.md diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-183448.log b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-183448.log deleted file mode 100644 index b1d9d05..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-183448.log +++ /dev/null @@ -1,5 +0,0 @@ -// Validating benchmarks: -// * Assembly NServiceBus.Envelope.CloudEvents.Benchmarks which defines benchmarks references non-optimized NServiceBus.Core - If you own this dependency, please, build it in RELEASE. - If you don't, you can disable this policy by using 'config.WithOptions(ConfigOptions.DisableOptimizationsValidator)'. - diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-184728.log b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-184728.log deleted file mode 100644 index 0f12fdc..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-184728.log +++ /dev/null @@ -1,1064 +0,0 @@ -// Validating benchmarks: -// ***** BenchmarkRunner: Start ***** -// ***** Found 10 benchmark(s) in total ***** -// ***** Building 1 exe(s) in Parallel: Start ***** -// start dotnet restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:IntermediateOutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/obj/Release/net10.0/" /p:OutDir="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/" /p:OutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/" in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b -// command took 0.76 sec and exited with 0 -// start dotnet build -c Release --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:IntermediateOutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/obj/Release/net10.0/" /p:OutDir="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/" /p:OutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/" --output "/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/" in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b -// command took 7.82 sec and exited with 0 -// ***** Done, took 00:00:08 (8.64 sec) ***** -// Found 10 benchmarks: -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) - -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_SmallJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 0 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-OFXFZH(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 172708.00 ns, 172.7080 us/op -2026-01-13 18:47:37.689 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 39990542.00 ns, 39.9905 ms/op - -WorkloadPilot 1: 2 op, 116875.00 ns, 58.4375 us/op -WorkloadPilot 2: 3 op, 38250.00 ns, 12.7500 us/op -WorkloadPilot 3: 4 op, 60834.00 ns, 15.2085 us/op -WorkloadPilot 4: 5 op, 115250.00 ns, 23.0500 us/op -WorkloadPilot 5: 6 op, 80750.00 ns, 13.4583 us/op -WorkloadPilot 6: 7 op, 85458.00 ns, 12.2083 us/op -WorkloadPilot 7: 8 op, 125458.00 ns, 15.6823 us/op -WorkloadPilot 8: 9 op, 94458.00 ns, 10.4953 us/op -WorkloadPilot 9: 10 op, 91750.00 ns, 9.1750 us/op -WorkloadPilot 10: 11 op, 90292.00 ns, 8.2084 us/op -WorkloadPilot 11: 12 op, 99709.00 ns, 8.3091 us/op -WorkloadPilot 12: 13 op, 106500.00 ns, 8.1923 us/op -WorkloadPilot 13: 14 op, 110958.00 ns, 7.9256 us/op -WorkloadPilot 14: 15 op, 118042.00 ns, 7.8695 us/op -WorkloadPilot 15: 16 op, 127875.00 ns, 7.9922 us/op -WorkloadPilot 16: 32 op, 244584.00 ns, 7.6433 us/op -WorkloadPilot 17: 64 op, 521291.00 ns, 8.1452 us/op -WorkloadPilot 18: 128 op, 1054959.00 ns, 8.2419 us/op -WorkloadPilot 19: 256 op, 2075458.00 ns, 8.1073 us/op -WorkloadPilot 20: 512 op, 4303625.00 ns, 8.4055 us/op -WorkloadPilot 21: 1024 op, 8334000.00 ns, 8.1387 us/op -WorkloadPilot 22: 2048 op, 17279666.00 ns, 8.4373 us/op -WorkloadPilot 23: 4096 op, 33155792.00 ns, 8.0947 us/op -WorkloadPilot 24: 8192 op, 70558875.00 ns, 8.6131 us/op -WorkloadPilot 25: 16384 op, 138784084.00 ns, 8.4707 us/op -WorkloadPilot 26: 32768 op, 269693458.00 ns, 8.2304 us/op -WorkloadPilot 27: 65536 op, 237823292.00 ns, 3.6289 us/op -WorkloadPilot 28: 131072 op, 261471291.00 ns, 1.9949 us/op -WorkloadPilot 29: 262144 op, 521624667.00 ns, 1.9898 us/op - -WorkloadWarmup 1: 262144 op, 522352125.00 ns, 1.9926 us/op -WorkloadWarmup 2: 262144 op, 521782667.00 ns, 1.9904 us/op -WorkloadWarmup 3: 262144 op, 522261542.00 ns, 1.9923 us/op - -// BeforeActualRun -WorkloadActual 1: 262144 op, 523039833.00 ns, 1.9952 us/op -WorkloadActual 2: 262144 op, 522718958.00 ns, 1.9940 us/op -WorkloadActual 3: 262144 op, 522054292.00 ns, 1.9915 us/op -WorkloadActual 4: 262144 op, 522140250.00 ns, 1.9918 us/op -WorkloadActual 5: 262144 op, 520945209.00 ns, 1.9872 us/op -WorkloadActual 6: 262144 op, 522377125.00 ns, 1.9927 us/op -WorkloadActual 7: 262144 op, 521105333.00 ns, 1.9879 us/op -WorkloadActual 8: 262144 op, 520338083.00 ns, 1.9849 us/op -WorkloadActual 9: 262144 op, 526565000.00 ns, 2.0087 us/op -WorkloadActual 10: 262144 op, 532352083.00 ns, 2.0308 us/op - -// AfterActualRun -WorkloadResult 1: 262144 op, 523039833.00 ns, 1.9952 us/op -WorkloadResult 2: 262144 op, 522718958.00 ns, 1.9940 us/op -WorkloadResult 3: 262144 op, 522054292.00 ns, 1.9915 us/op -WorkloadResult 4: 262144 op, 522140250.00 ns, 1.9918 us/op -WorkloadResult 5: 262144 op, 520945209.00 ns, 1.9872 us/op -WorkloadResult 6: 262144 op, 522377125.00 ns, 1.9927 us/op -WorkloadResult 7: 262144 op, 521105333.00 ns, 1.9879 us/op -WorkloadResult 8: 262144 op, 520338083.00 ns, 1.9849 us/op -// GC: 174 1 0 1094783016 262144 -// Threading: 0 0 262144 - -// AfterAll -// Benchmark Process 9698 has exited with code 0. - -Mean = 1.991 μs, StdErr = 0.001 μs (0.06%), N = 8, StdDev = 0.004 μs -Min = 1.985 μs, Q1 = 1.988 μs, Median = 1.992 μs, Q3 = 1.993 μs, Max = 1.995 μs -IQR = 0.005 μs, LowerFence = 1.980 μs, UpperFence = 2.001 μs -ConfidenceInterval = [1.984 μs; 1.998 μs] (CI 99.9%), Margin = 0.007 μs (0.35% of Mean) -Skewness = -0.28, Kurtosis = 1.38, MValue = 2 - -// ** Remained 9 (90,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 1m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_SmallJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 1 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-YAVIDK(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 162583.00 ns, 162.5830 us/op -2026-01-13 18:47:46.879 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 39188458.00 ns, 39.1885 ms/op - -WorkloadPilot 1: 2 op, 91000.00 ns, 45.5000 us/op -WorkloadPilot 2: 3 op, 60708.00 ns, 20.2360 us/op -WorkloadPilot 3: 4 op, 51833.00 ns, 12.9583 us/op -WorkloadPilot 4: 5 op, 73000.00 ns, 14.6000 us/op -WorkloadPilot 5: 6 op, 62750.00 ns, 10.4583 us/op -WorkloadPilot 6: 7 op, 71125.00 ns, 10.1607 us/op -WorkloadPilot 7: 8 op, 71292.00 ns, 8.9115 us/op -WorkloadPilot 8: 9 op, 77583.00 ns, 8.6203 us/op -WorkloadPilot 9: 10 op, 85416.00 ns, 8.5416 us/op -WorkloadPilot 10: 11 op, 91833.00 ns, 8.3485 us/op -WorkloadPilot 11: 12 op, 99166.00 ns, 8.2638 us/op -WorkloadPilot 12: 13 op, 117458.00 ns, 9.0352 us/op -WorkloadPilot 13: 14 op, 121166.00 ns, 8.6547 us/op -WorkloadPilot 14: 15 op, 124959.00 ns, 8.3306 us/op -WorkloadPilot 15: 16 op, 157042.00 ns, 9.8151 us/op -WorkloadPilot 16: 32 op, 317084.00 ns, 9.9089 us/op -WorkloadPilot 17: 64 op, 506875.00 ns, 7.9199 us/op -WorkloadPilot 18: 128 op, 982291.00 ns, 7.6741 us/op -WorkloadPilot 19: 256 op, 2064125.00 ns, 8.0630 us/op -WorkloadPilot 20: 512 op, 4396000.00 ns, 8.5859 us/op -WorkloadPilot 21: 1024 op, 8847000.00 ns, 8.6396 us/op -WorkloadPilot 22: 2048 op, 17572792.00 ns, 8.5805 us/op -WorkloadPilot 23: 4096 op, 33320041.00 ns, 8.1348 us/op -WorkloadPilot 24: 8192 op, 65593875.00 ns, 8.0071 us/op -WorkloadPilot 25: 16384 op, 144669667.00 ns, 8.8299 us/op -WorkloadPilot 26: 32768 op, 266752792.00 ns, 8.1406 us/op -WorkloadPilot 27: 65536 op, 251084583.00 ns, 3.8312 us/op -WorkloadPilot 28: 131072 op, 270988625.00 ns, 2.0675 us/op -WorkloadPilot 29: 262144 op, 537412708.00 ns, 2.0501 us/op - -WorkloadWarmup 1: 262144 op, 536533375.00 ns, 2.0467 us/op -WorkloadWarmup 2: 262144 op, 535661541.00 ns, 2.0434 us/op -WorkloadWarmup 3: 262144 op, 536676875.00 ns, 2.0473 us/op - -// BeforeActualRun -WorkloadActual 1: 262144 op, 543931500.00 ns, 2.0749 us/op -WorkloadActual 2: 262144 op, 535021708.00 ns, 2.0409 us/op -WorkloadActual 3: 262144 op, 534802209.00 ns, 2.0401 us/op -WorkloadActual 4: 262144 op, 535902375.00 ns, 2.0443 us/op -WorkloadActual 5: 262144 op, 534677583.00 ns, 2.0396 us/op -WorkloadActual 6: 262144 op, 534955292.00 ns, 2.0407 us/op -WorkloadActual 7: 262144 op, 534688834.00 ns, 2.0397 us/op -WorkloadActual 8: 262144 op, 536390125.00 ns, 2.0462 us/op -WorkloadActual 9: 262144 op, 538743334.00 ns, 2.0551 us/op -WorkloadActual 10: 262144 op, 534104000.00 ns, 2.0374 us/op - -// AfterActualRun -WorkloadResult 1: 262144 op, 535021708.00 ns, 2.0409 us/op -WorkloadResult 2: 262144 op, 534802209.00 ns, 2.0401 us/op -WorkloadResult 3: 262144 op, 535902375.00 ns, 2.0443 us/op -WorkloadResult 4: 262144 op, 534677583.00 ns, 2.0396 us/op -WorkloadResult 5: 262144 op, 534955292.00 ns, 2.0407 us/op -WorkloadResult 6: 262144 op, 534688834.00 ns, 2.0397 us/op -WorkloadResult 7: 262144 op, 536390125.00 ns, 2.0462 us/op -WorkloadResult 8: 262144 op, 534104000.00 ns, 2.0374 us/op -// GC: 174 1 0 1094783016 262144 -// Threading: 0 0 262144 - -// AfterAll -// Benchmark Process 9700 has exited with code 0. - -Mean = 2.041 μs, StdErr = 0.001 μs (0.05%), N = 8, StdDev = 0.003 μs -Min = 2.037 μs, Q1 = 2.040 μs, Median = 2.040 μs, Q3 = 2.042 μs, Max = 2.046 μs -IQR = 0.002 μs, LowerFence = 2.036 μs, UpperFence = 2.045 μs -ConfidenceInterval = [2.036 μs; 2.046 μs] (CI 99.9%), Margin = 0.005 μs (0.26% of Mean) -Skewness = 0.59, Kurtosis = 1.93, MValue = 2 - -// ** Remained 8 (80,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 1m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_MediumJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 2 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-BGKEIN(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 157250.00 ns, 157.2500 us/op -2026-01-13 18:47:56.258 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 41437584.00 ns, 41.4376 ms/op - -WorkloadPilot 1: 2 op, 87458.00 ns, 43.7290 us/op -WorkloadPilot 2: 3 op, 51291.00 ns, 17.0970 us/op -WorkloadPilot 3: 4 op, 56708.00 ns, 14.1770 us/op -WorkloadPilot 4: 5 op, 66875.00 ns, 13.3750 us/op -WorkloadPilot 5: 6 op, 78416.00 ns, 13.0693 us/op -WorkloadPilot 6: 7 op, 115334.00 ns, 16.4763 us/op -WorkloadPilot 7: 8 op, 114416.00 ns, 14.3020 us/op -WorkloadPilot 8: 9 op, 153250.00 ns, 17.0278 us/op -WorkloadPilot 9: 10 op, 133458.00 ns, 13.3458 us/op -WorkloadPilot 10: 11 op, 151041.00 ns, 13.7310 us/op -WorkloadPilot 11: 12 op, 154708.00 ns, 12.8923 us/op -WorkloadPilot 12: 13 op, 167916.00 ns, 12.9166 us/op -WorkloadPilot 13: 14 op, 176875.00 ns, 12.6339 us/op -WorkloadPilot 14: 15 op, 188166.00 ns, 12.5444 us/op -WorkloadPilot 15: 16 op, 200500.00 ns, 12.5313 us/op -WorkloadPilot 16: 32 op, 436375.00 ns, 13.6367 us/op -WorkloadPilot 17: 64 op, 797250.00 ns, 12.4570 us/op -WorkloadPilot 18: 128 op, 1601792.00 ns, 12.5140 us/op -WorkloadPilot 19: 256 op, 3326041.00 ns, 12.9923 us/op -WorkloadPilot 20: 512 op, 6477625.00 ns, 12.6516 us/op -WorkloadPilot 21: 1024 op, 13946375.00 ns, 13.6195 us/op -WorkloadPilot 22: 2048 op, 26378375.00 ns, 12.8801 us/op -WorkloadPilot 23: 4096 op, 50530417.00 ns, 12.3365 us/op -WorkloadPilot 24: 8192 op, 102673250.00 ns, 12.5334 us/op -WorkloadPilot 25: 16384 op, 229642417.00 ns, 14.0163 us/op -WorkloadPilot 26: 32768 op, 415983792.00 ns, 12.6948 us/op -WorkloadPilot 27: 65536 op, 338675667.00 ns, 5.1678 us/op -WorkloadPilot 28: 131072 op, 458758542.00 ns, 3.5000 us/op -WorkloadPilot 29: 262144 op, 914807000.00 ns, 3.4897 us/op - -WorkloadWarmup 1: 262144 op, 919138083.00 ns, 3.5062 us/op -WorkloadWarmup 2: 262144 op, 919837875.00 ns, 3.5089 us/op -WorkloadWarmup 3: 262144 op, 918837666.00 ns, 3.5051 us/op - -// BeforeActualRun -WorkloadActual 1: 262144 op, 915990667.00 ns, 3.4942 us/op -WorkloadActual 2: 262144 op, 917348750.00 ns, 3.4994 us/op -WorkloadActual 3: 262144 op, 913757791.00 ns, 3.4857 us/op -WorkloadActual 4: 262144 op, 917689583.00 ns, 3.5007 us/op -WorkloadActual 5: 262144 op, 912246458.00 ns, 3.4799 us/op -WorkloadActual 6: 262144 op, 914790208.00 ns, 3.4896 us/op -WorkloadActual 7: 262144 op, 917218541.00 ns, 3.4989 us/op -WorkloadActual 8: 262144 op, 917015875.00 ns, 3.4981 us/op -WorkloadActual 9: 262144 op, 914672417.00 ns, 3.4892 us/op -WorkloadActual 10: 262144 op, 920894584.00 ns, 3.5129 us/op - -// AfterActualRun -WorkloadResult 1: 262144 op, 915990667.00 ns, 3.4942 us/op -WorkloadResult 2: 262144 op, 917348750.00 ns, 3.4994 us/op -WorkloadResult 3: 262144 op, 913757791.00 ns, 3.4857 us/op -WorkloadResult 4: 262144 op, 917689583.00 ns, 3.5007 us/op -WorkloadResult 5: 262144 op, 912246458.00 ns, 3.4799 us/op -WorkloadResult 6: 262144 op, 914790208.00 ns, 3.4896 us/op -WorkloadResult 7: 262144 op, 917218541.00 ns, 3.4989 us/op -WorkloadResult 8: 262144 op, 917015875.00 ns, 3.4981 us/op -WorkloadResult 9: 262144 op, 914672417.00 ns, 3.4892 us/op -WorkloadResult 10: 262144 op, 920894584.00 ns, 3.5129 us/op -// GC: 303 3 0 1902237104 262144 -// Threading: 0 0 262144 - -// AfterAll -// Benchmark Process 9701 has exited with code 0. - -Mean = 3.495 μs, StdErr = 0.003 μs (0.08%), N = 10, StdDev = 0.009 μs -Min = 3.480 μs, Q1 = 3.489 μs, Median = 3.496 μs, Q3 = 3.499 μs, Max = 3.513 μs -IQR = 0.010 μs, LowerFence = 3.474 μs, UpperFence = 3.514 μs -ConfidenceInterval = [3.481 μs; 3.509 μs] (CI 99.9%), Margin = 0.014 μs (0.40% of Mean) -Skewness = 0.23, Kurtosis = 2.25, MValue = 2 - -// ** Remained 7 (70,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 1m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_MediumJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 3 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-XIHKWJ(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 180042.00 ns, 180.0420 us/op -2026-01-13 18:48:11.922 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 39917500.00 ns, 39.9175 ms/op - -WorkloadPilot 1: 2 op, 122791.00 ns, 61.3955 us/op -WorkloadPilot 2: 3 op, 58333.00 ns, 19.4443 us/op -WorkloadPilot 3: 4 op, 61792.00 ns, 15.4480 us/op -WorkloadPilot 4: 5 op, 72250.00 ns, 14.4500 us/op -WorkloadPilot 5: 6 op, 110000.00 ns, 18.3333 us/op -WorkloadPilot 6: 7 op, 110209.00 ns, 15.7441 us/op -WorkloadPilot 7: 8 op, 111375.00 ns, 13.9219 us/op -WorkloadPilot 8: 9 op, 159959.00 ns, 17.7732 us/op -WorkloadPilot 9: 10 op, 144917.00 ns, 14.4917 us/op -WorkloadPilot 10: 11 op, 150208.00 ns, 13.6553 us/op -WorkloadPilot 11: 12 op, 158334.00 ns, 13.1945 us/op -WorkloadPilot 12: 13 op, 169166.00 ns, 13.0128 us/op -WorkloadPilot 13: 14 op, 182166.00 ns, 13.0119 us/op -WorkloadPilot 14: 15 op, 193750.00 ns, 12.9167 us/op -WorkloadPilot 15: 16 op, 205916.00 ns, 12.8698 us/op -WorkloadPilot 16: 32 op, 404208.00 ns, 12.6315 us/op -WorkloadPilot 17: 64 op, 820625.00 ns, 12.8223 us/op -WorkloadPilot 18: 128 op, 1708000.00 ns, 13.3438 us/op -WorkloadPilot 19: 256 op, 3409541.00 ns, 13.3185 us/op -WorkloadPilot 20: 512 op, 6859500.00 ns, 13.3975 us/op -WorkloadPilot 21: 1024 op, 14327417.00 ns, 13.9916 us/op -WorkloadPilot 22: 2048 op, 27535500.00 ns, 13.4451 us/op -WorkloadPilot 23: 4096 op, 52365708.00 ns, 12.7846 us/op -WorkloadPilot 24: 8192 op, 122427125.00 ns, 14.9447 us/op -WorkloadPilot 25: 16384 op, 232087542.00 ns, 14.1655 us/op -WorkloadPilot 26: 32768 op, 387996542.00 ns, 11.8407 us/op -WorkloadPilot 27: 65536 op, 271095583.00 ns, 4.1366 us/op -WorkloadPilot 28: 131072 op, 465416334.00 ns, 3.5508 us/op -WorkloadPilot 29: 262144 op, 925723500.00 ns, 3.5314 us/op - -WorkloadWarmup 1: 262144 op, 931829250.00 ns, 3.5546 us/op -WorkloadWarmup 2: 262144 op, 927540459.00 ns, 3.5383 us/op -WorkloadWarmup 3: 262144 op, 930144750.00 ns, 3.5482 us/op - -// BeforeActualRun -WorkloadActual 1: 262144 op, 924927750.00 ns, 3.5283 us/op -WorkloadActual 2: 262144 op, 938538916.00 ns, 3.5802 us/op -WorkloadActual 3: 262144 op, 924031458.00 ns, 3.5249 us/op -WorkloadActual 4: 262144 op, 929952500.00 ns, 3.5475 us/op -WorkloadActual 5: 262144 op, 924259208.00 ns, 3.5258 us/op -WorkloadActual 6: 262144 op, 928040875.00 ns, 3.5402 us/op -WorkloadActual 7: 262144 op, 925738625.00 ns, 3.5314 us/op -WorkloadActual 8: 262144 op, 929247583.00 ns, 3.5448 us/op -WorkloadActual 9: 262144 op, 923100125.00 ns, 3.5213 us/op -WorkloadActual 10: 262144 op, 926895125.00 ns, 3.5358 us/op - -// AfterActualRun -WorkloadResult 1: 262144 op, 924927750.00 ns, 3.5283 us/op -WorkloadResult 2: 262144 op, 924031458.00 ns, 3.5249 us/op -WorkloadResult 3: 262144 op, 929952500.00 ns, 3.5475 us/op -WorkloadResult 4: 262144 op, 924259208.00 ns, 3.5258 us/op -WorkloadResult 5: 262144 op, 928040875.00 ns, 3.5402 us/op -WorkloadResult 6: 262144 op, 925738625.00 ns, 3.5314 us/op -WorkloadResult 7: 262144 op, 929247583.00 ns, 3.5448 us/op -WorkloadResult 8: 262144 op, 923100125.00 ns, 3.5213 us/op -WorkloadResult 9: 262144 op, 926895125.00 ns, 3.5358 us/op -// GC: 303 3 0 1902237104 262144 -// Threading: 0 0 262144 - -// AfterAll -// Benchmark Process 9703 has exited with code 0. - -Mean = 3.533 μs, StdErr = 0.003 μs (0.09%), N = 9, StdDev = 0.009 μs -Min = 3.521 μs, Q1 = 3.526 μs, Median = 3.531 μs, Q3 = 3.540 μs, Max = 3.547 μs -IQR = 0.014 μs, LowerFence = 3.504 μs, UpperFence = 3.562 μs -ConfidenceInterval = [3.518 μs; 3.549 μs] (CI 99.9%), Margin = 0.016 μs (0.44% of Mean) -Skewness = 0.25, Kurtosis = 1.35, MValue = 2 - -// ** Remained 6 (60,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 1m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_LargeJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 4 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-PUPMPI(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 188792.00 ns, 188.7920 us/op -2026-01-13 18:48:27.686 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 39946833.00 ns, 39.9468 ms/op - -WorkloadPilot 1: 2 op, 511625.00 ns, 255.8125 us/op -WorkloadPilot 2: 3 op, 581125.00 ns, 193.7083 us/op -WorkloadPilot 3: 4 op, 756042.00 ns, 189.0105 us/op -WorkloadPilot 4: 5 op, 932292.00 ns, 186.4584 us/op -WorkloadPilot 5: 6 op, 1099792.00 ns, 183.2987 us/op -WorkloadPilot 6: 7 op, 1323916.00 ns, 189.1309 us/op -WorkloadPilot 7: 8 op, 1613292.00 ns, 201.6615 us/op -WorkloadPilot 8: 9 op, 1797209.00 ns, 199.6899 us/op -WorkloadPilot 9: 10 op, 1970708.00 ns, 197.0708 us/op -WorkloadPilot 10: 11 op, 2315875.00 ns, 210.5341 us/op -WorkloadPilot 11: 12 op, 2354041.00 ns, 196.1701 us/op -WorkloadPilot 12: 13 op, 2608542.00 ns, 200.6571 us/op -WorkloadPilot 13: 14 op, 2681042.00 ns, 191.5030 us/op -WorkloadPilot 14: 15 op, 2812042.00 ns, 187.4695 us/op -WorkloadPilot 15: 16 op, 3103958.00 ns, 193.9974 us/op -WorkloadPilot 16: 32 op, 6291667.00 ns, 196.6146 us/op -WorkloadPilot 17: 64 op, 12999625.00 ns, 203.1191 us/op -WorkloadPilot 18: 128 op, 24825250.00 ns, 193.9473 us/op -WorkloadPilot 19: 256 op, 47500958.00 ns, 185.5506 us/op -WorkloadPilot 20: 512 op, 91660667.00 ns, 179.0247 us/op -WorkloadPilot 21: 1024 op, 180569541.00 ns, 176.3374 us/op -WorkloadPilot 22: 2048 op, 231153834.00 ns, 112.8681 us/op -WorkloadPilot 23: 4096 op, 347445792.00 ns, 84.8256 us/op -WorkloadPilot 24: 8192 op, 465485792.00 ns, 56.8220 us/op -WorkloadPilot 25: 16384 op, 931535458.00 ns, 56.8564 us/op - -WorkloadWarmup 1: 16384 op, 937714500.00 ns, 57.2336 us/op -WorkloadWarmup 2: 16384 op, 931176416.00 ns, 56.8345 us/op -WorkloadWarmup 3: 16384 op, 937228416.00 ns, 57.2039 us/op - -// BeforeActualRun -WorkloadActual 1: 16384 op, 929004208.00 ns, 56.7019 us/op -WorkloadActual 2: 16384 op, 931512250.00 ns, 56.8550 us/op -WorkloadActual 3: 16384 op, 936435000.00 ns, 57.1555 us/op -WorkloadActual 4: 16384 op, 928940875.00 ns, 56.6981 us/op -WorkloadActual 5: 16384 op, 931523542.00 ns, 56.8557 us/op -WorkloadActual 6: 16384 op, 938495834.00 ns, 57.2812 us/op -WorkloadActual 7: 16384 op, 924774166.00 ns, 56.4437 us/op -WorkloadActual 8: 16384 op, 932736833.00 ns, 56.9297 us/op -WorkloadActual 9: 16384 op, 932564042.00 ns, 56.9192 us/op -WorkloadActual 10: 16384 op, 929721333.00 ns, 56.7457 us/op - -// AfterActualRun -WorkloadResult 1: 16384 op, 929004208.00 ns, 56.7019 us/op -WorkloadResult 2: 16384 op, 931512250.00 ns, 56.8550 us/op -WorkloadResult 3: 16384 op, 936435000.00 ns, 57.1555 us/op -WorkloadResult 4: 16384 op, 928940875.00 ns, 56.6981 us/op -WorkloadResult 5: 16384 op, 931523542.00 ns, 56.8557 us/op -WorkloadResult 6: 16384 op, 924774166.00 ns, 56.4437 us/op -WorkloadResult 7: 16384 op, 932736833.00 ns, 56.9297 us/op -WorkloadResult 8: 16384 op, 932564042.00 ns, 56.9192 us/op -WorkloadResult 9: 16384 op, 929721333.00 ns, 56.7457 us/op -// GC: 341 85 0 2147749856 16384 -// Threading: 0 0 16384 - -// AfterAll -// Benchmark Process 9704 has exited with code 0. - -Mean = 56.812 μs, StdErr = 0.066 μs (0.12%), N = 9, StdDev = 0.198 μs -Min = 56.444 μs, Q1 = 56.702 μs, Median = 56.855 μs, Q3 = 56.919 μs, Max = 57.155 μs -IQR = 0.217 μs, LowerFence = 56.376 μs, UpperFence = 57.245 μs -ConfidenceInterval = [56.480 μs; 57.144 μs] (CI 99.9%), Margin = 0.332 μs (0.58% of Mean) -Skewness = -0.13, Kurtosis = 2.4, MValue = 2 - -// ** Remained 5 (50,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 1m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_LargeJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 5 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-IPDXQY(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 173375.00 ns, 173.3750 us/op -2026-01-13 18:48:43.359 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 39434167.00 ns, 39.4342 ms/op - -WorkloadPilot 1: 2 op, 480750.00 ns, 240.3750 us/op -WorkloadPilot 2: 3 op, 577958.00 ns, 192.6527 us/op -WorkloadPilot 3: 4 op, 757625.00 ns, 189.4063 us/op -WorkloadPilot 4: 5 op, 940792.00 ns, 188.1584 us/op -WorkloadPilot 5: 6 op, 1154417.00 ns, 192.4028 us/op -WorkloadPilot 6: 7 op, 1380083.00 ns, 197.1547 us/op -WorkloadPilot 7: 8 op, 1667083.00 ns, 208.3854 us/op -WorkloadPilot 8: 9 op, 1714583.00 ns, 190.5092 us/op -WorkloadPilot 9: 10 op, 1939000.00 ns, 193.9000 us/op -WorkloadPilot 10: 11 op, 2097375.00 ns, 190.6705 us/op -WorkloadPilot 11: 12 op, 2283875.00 ns, 190.3229 us/op -WorkloadPilot 12: 13 op, 2546166.00 ns, 195.8589 us/op -WorkloadPilot 13: 14 op, 2749000.00 ns, 196.3571 us/op -WorkloadPilot 14: 15 op, 2828708.00 ns, 188.5805 us/op -WorkloadPilot 15: 16 op, 3112375.00 ns, 194.5234 us/op -WorkloadPilot 16: 32 op, 6020834.00 ns, 188.1511 us/op -WorkloadPilot 17: 64 op, 12940583.00 ns, 202.1966 us/op -WorkloadPilot 18: 128 op, 24653333.00 ns, 192.6042 us/op -WorkloadPilot 19: 256 op, 48092375.00 ns, 187.8608 us/op -WorkloadPilot 20: 512 op, 102022834.00 ns, 199.2633 us/op -WorkloadPilot 21: 1024 op, 177939125.00 ns, 173.7687 us/op -WorkloadPilot 22: 2048 op, 272160917.00 ns, 132.8911 us/op -WorkloadPilot 23: 4096 op, 368221166.00 ns, 89.8977 us/op -WorkloadPilot 24: 8192 op, 474428542.00 ns, 57.9136 us/op -WorkloadPilot 25: 16384 op, 938160792.00 ns, 57.2608 us/op - -WorkloadWarmup 1: 16384 op, 932141917.00 ns, 56.8934 us/op -WorkloadWarmup 2: 16384 op, 933952875.00 ns, 57.0040 us/op -WorkloadWarmup 3: 16384 op, 940216000.00 ns, 57.3862 us/op - -// BeforeActualRun -WorkloadActual 1: 16384 op, 933144292.00 ns, 56.9546 us/op -WorkloadActual 2: 16384 op, 935062042.00 ns, 57.0717 us/op -WorkloadActual 3: 16384 op, 930412500.00 ns, 56.7879 us/op -WorkloadActual 4: 16384 op, 931647625.00 ns, 56.8633 us/op -WorkloadActual 5: 16384 op, 931371333.00 ns, 56.8464 us/op -WorkloadActual 6: 16384 op, 934799084.00 ns, 57.0556 us/op -WorkloadActual 7: 16384 op, 930934125.00 ns, 56.8197 us/op -WorkloadActual 8: 16384 op, 938937542.00 ns, 57.3082 us/op -WorkloadActual 9: 16384 op, 926522333.00 ns, 56.5504 us/op -WorkloadActual 10: 16384 op, 935950958.00 ns, 57.1259 us/op - -// AfterActualRun -WorkloadResult 1: 16384 op, 933144292.00 ns, 56.9546 us/op -WorkloadResult 2: 16384 op, 935062042.00 ns, 57.0717 us/op -WorkloadResult 3: 16384 op, 930412500.00 ns, 56.7879 us/op -WorkloadResult 4: 16384 op, 931647625.00 ns, 56.8633 us/op -WorkloadResult 5: 16384 op, 931371333.00 ns, 56.8464 us/op -WorkloadResult 6: 16384 op, 934799084.00 ns, 57.0556 us/op -WorkloadResult 7: 16384 op, 930934125.00 ns, 56.8197 us/op -WorkloadResult 8: 16384 op, 938937542.00 ns, 57.3082 us/op -WorkloadResult 9: 16384 op, 926522333.00 ns, 56.5504 us/op -WorkloadResult 10: 16384 op, 935950958.00 ns, 57.1259 us/op -// GC: 341 85 0 2147749856 16384 -// Threading: 0 0 16384 - -// AfterAll -// Benchmark Process 9707 has exited with code 0. - -Mean = 56.938 μs, StdErr = 0.067 μs (0.12%), N = 10, StdDev = 0.212 μs -Min = 56.550 μs, Q1 = 56.826 μs, Median = 56.909 μs, Q3 = 57.068 μs, Max = 57.308 μs -IQR = 0.241 μs, LowerFence = 56.464 μs, UpperFence = 57.430 μs -ConfidenceInterval = [56.618 μs; 57.259 μs] (CI 99.9%), Margin = 0.321 μs (0.56% of Mean) -Skewness = -0.04, Kurtosis = 2.17, MValue = 2 - -// ** Remained 4 (40,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 0m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_Base64 --job "IterationCount=10, WarmupCount=3" --benchmarkId 6 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-EDMQTQ(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 225625.00 ns, 225.6250 us/op -2026-01-13 18:48:59.138 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 41669708.00 ns, 41.6697 ms/op - -WorkloadPilot 1: 2 op, 125250.00 ns, 62.6250 us/op -WorkloadPilot 2: 3 op, 39333.00 ns, 13.1110 us/op -WorkloadPilot 3: 4 op, 40834.00 ns, 10.2085 us/op -WorkloadPilot 4: 5 op, 47250.00 ns, 9.4500 us/op -WorkloadPilot 5: 6 op, 55000.00 ns, 9.1667 us/op -WorkloadPilot 6: 7 op, 62167.00 ns, 8.8810 us/op -WorkloadPilot 7: 8 op, 69666.00 ns, 8.7083 us/op -WorkloadPilot 8: 9 op, 77833.00 ns, 8.6481 us/op -WorkloadPilot 9: 10 op, 87041.00 ns, 8.7041 us/op -WorkloadPilot 10: 11 op, 125792.00 ns, 11.4356 us/op -WorkloadPilot 11: 12 op, 164209.00 ns, 13.6841 us/op -WorkloadPilot 12: 13 op, 128625.00 ns, 9.8942 us/op -WorkloadPilot 13: 14 op, 124375.00 ns, 8.8839 us/op -WorkloadPilot 14: 15 op, 125333.00 ns, 8.3555 us/op -WorkloadPilot 15: 16 op, 130916.00 ns, 8.1823 us/op -WorkloadPilot 16: 32 op, 252000.00 ns, 7.8750 us/op -WorkloadPilot 17: 64 op, 492541.00 ns, 7.6960 us/op -WorkloadPilot 18: 128 op, 976167.00 ns, 7.6263 us/op -WorkloadPilot 19: 256 op, 2136625.00 ns, 8.3462 us/op -WorkloadPilot 20: 512 op, 4323541.00 ns, 8.4444 us/op -WorkloadPilot 21: 1024 op, 8766625.00 ns, 8.5612 us/op -WorkloadPilot 22: 2048 op, 17339834.00 ns, 8.4667 us/op -WorkloadPilot 23: 4096 op, 32308667.00 ns, 7.8879 us/op -WorkloadPilot 24: 8192 op, 64980542.00 ns, 7.9322 us/op -WorkloadPilot 25: 16384 op, 141919625.00 ns, 8.6621 us/op -WorkloadPilot 26: 32768 op, 290863292.00 ns, 8.8764 us/op -WorkloadPilot 27: 65536 op, 250992375.00 ns, 3.8298 us/op -WorkloadPilot 28: 131072 op, 310992583.00 ns, 2.3727 us/op -WorkloadPilot 29: 262144 op, 621678208.00 ns, 2.3715 us/op - -WorkloadWarmup 1: 262144 op, 617181791.00 ns, 2.3544 us/op -WorkloadWarmup 2: 262144 op, 616309458.00 ns, 2.3510 us/op -WorkloadWarmup 3: 262144 op, 616954000.00 ns, 2.3535 us/op - -// BeforeActualRun -WorkloadActual 1: 262144 op, 617925292.00 ns, 2.3572 us/op -WorkloadActual 2: 262144 op, 617040125.00 ns, 2.3538 us/op -WorkloadActual 3: 262144 op, 615349709.00 ns, 2.3474 us/op -WorkloadActual 4: 262144 op, 615690791.00 ns, 2.3487 us/op -WorkloadActual 5: 262144 op, 620484125.00 ns, 2.3670 us/op -WorkloadActual 6: 262144 op, 623486917.00 ns, 2.3784 us/op -WorkloadActual 7: 262144 op, 615745167.00 ns, 2.3489 us/op -WorkloadActual 8: 262144 op, 618375333.00 ns, 2.3589 us/op -WorkloadActual 9: 262144 op, 619140542.00 ns, 2.3618 us/op -WorkloadActual 10: 262144 op, 615245625.00 ns, 2.3470 us/op - -// AfterActualRun -WorkloadResult 1: 262144 op, 617925292.00 ns, 2.3572 us/op -WorkloadResult 2: 262144 op, 617040125.00 ns, 2.3538 us/op -WorkloadResult 3: 262144 op, 615349709.00 ns, 2.3474 us/op -WorkloadResult 4: 262144 op, 615690791.00 ns, 2.3487 us/op -WorkloadResult 5: 262144 op, 620484125.00 ns, 2.3670 us/op -WorkloadResult 6: 262144 op, 623486917.00 ns, 2.3784 us/op -WorkloadResult 7: 262144 op, 615745167.00 ns, 2.3489 us/op -WorkloadResult 8: 262144 op, 618375333.00 ns, 2.3589 us/op -WorkloadResult 9: 262144 op, 619140542.00 ns, 2.3618 us/op -WorkloadResult 10: 262144 op, 615245625.00 ns, 2.3470 us/op -// GC: 188 2 0 1182868888 262144 -// Threading: 0 0 262144 - -// AfterAll -// Benchmark Process 9708 has exited with code 0. - -Mean = 2.357 μs, StdErr = 0.003 μs (0.14%), N = 10, StdDev = 0.010 μs -Min = 2.347 μs, Q1 = 2.349 μs, Median = 2.356 μs, Q3 = 2.361 μs, Max = 2.378 μs -IQR = 0.012 μs, LowerFence = 2.330 μs, UpperFence = 2.380 μs -ConfidenceInterval = [2.342 μs; 2.372 μs] (CI 99.9%), Margin = 0.015 μs (0.65% of Mean) -Skewness = 0.78, Kurtosis = 2.39, MValue = 2 - -// ** Remained 3 (30,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 0m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_Base64 --job "IterationCount=10, WarmupCount=3" --benchmarkId 7 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-HTOURQ(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 173541.00 ns, 173.5410 us/op -2026-01-13 18:49:09.800 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 40036250.00 ns, 40.0363 ms/op - -WorkloadPilot 1: 2 op, 110958.00 ns, 55.4790 us/op -WorkloadPilot 2: 3 op, 38792.00 ns, 12.9307 us/op -WorkloadPilot 3: 4 op, 58750.00 ns, 14.6875 us/op -WorkloadPilot 4: 5 op, 51250.00 ns, 10.2500 us/op -WorkloadPilot 5: 6 op, 58375.00 ns, 9.7292 us/op -WorkloadPilot 6: 7 op, 63791.00 ns, 9.1130 us/op -WorkloadPilot 7: 8 op, 97125.00 ns, 12.1406 us/op -WorkloadPilot 8: 9 op, 86250.00 ns, 9.5833 us/op -WorkloadPilot 9: 10 op, 99667.00 ns, 9.9667 us/op -WorkloadPilot 10: 11 op, 122875.00 ns, 11.1705 us/op -WorkloadPilot 11: 12 op, 138875.00 ns, 11.5729 us/op -WorkloadPilot 12: 13 op, 131000.00 ns, 10.0769 us/op -WorkloadPilot 13: 14 op, 121250.00 ns, 8.6607 us/op -WorkloadPilot 14: 15 op, 129833.00 ns, 8.6555 us/op -WorkloadPilot 15: 16 op, 137208.00 ns, 8.5755 us/op -WorkloadPilot 16: 32 op, 261292.00 ns, 8.1654 us/op -WorkloadPilot 17: 64 op, 519416.00 ns, 8.1159 us/op -WorkloadPilot 18: 128 op, 1016625.00 ns, 7.9424 us/op -WorkloadPilot 19: 256 op, 2090125.00 ns, 8.1646 us/op -WorkloadPilot 20: 512 op, 4411125.00 ns, 8.6155 us/op -WorkloadPilot 21: 1024 op, 9028125.00 ns, 8.8165 us/op -WorkloadPilot 22: 2048 op, 17894958.00 ns, 8.7378 us/op -WorkloadPilot 23: 4096 op, 34757792.00 ns, 8.4858 us/op -WorkloadPilot 24: 8192 op, 67096209.00 ns, 8.1905 us/op -WorkloadPilot 25: 16384 op, 152778250.00 ns, 9.3248 us/op -WorkloadPilot 26: 32768 op, 301104625.00 ns, 9.1890 us/op -WorkloadPilot 27: 65536 op, 236810875.00 ns, 3.6134 us/op -WorkloadPilot 28: 131072 op, 314258041.00 ns, 2.3976 us/op -WorkloadPilot 29: 262144 op, 632890459.00 ns, 2.4143 us/op - -WorkloadWarmup 1: 262144 op, 627463042.00 ns, 2.3936 us/op -WorkloadWarmup 2: 262144 op, 628258042.00 ns, 2.3966 us/op -WorkloadWarmup 3: 262144 op, 627575666.00 ns, 2.3940 us/op - -// BeforeActualRun -WorkloadActual 1: 262144 op, 628781209.00 ns, 2.3986 us/op -WorkloadActual 2: 262144 op, 628144417.00 ns, 2.3962 us/op -WorkloadActual 3: 262144 op, 633454417.00 ns, 2.4164 us/op -WorkloadActual 4: 262144 op, 627897125.00 ns, 2.3952 us/op -WorkloadActual 5: 262144 op, 627964208.00 ns, 2.3955 us/op -WorkloadActual 6: 262144 op, 627752833.00 ns, 2.3947 us/op -WorkloadActual 7: 262144 op, 626357125.00 ns, 2.3894 us/op -WorkloadActual 8: 262144 op, 627807875.00 ns, 2.3949 us/op -WorkloadActual 9: 262144 op, 627619542.00 ns, 2.3942 us/op -WorkloadActual 10: 262144 op, 625576917.00 ns, 2.3864 us/op - -// AfterActualRun -WorkloadResult 1: 262144 op, 628144417.00 ns, 2.3962 us/op -WorkloadResult 2: 262144 op, 627897125.00 ns, 2.3952 us/op -WorkloadResult 3: 262144 op, 627964208.00 ns, 2.3955 us/op -WorkloadResult 4: 262144 op, 627752833.00 ns, 2.3947 us/op -WorkloadResult 5: 262144 op, 626357125.00 ns, 2.3894 us/op -WorkloadResult 6: 262144 op, 627807875.00 ns, 2.3949 us/op -WorkloadResult 7: 262144 op, 627619542.00 ns, 2.3942 us/op -WorkloadResult 8: 262144 op, 625576917.00 ns, 2.3864 us/op -// GC: 188 2 0 1182868888 262144 -// Threading: 0 0 262144 - -// AfterAll -// Benchmark Process 9709 has exited with code 0. - -Mean = 2.393 μs, StdErr = 0.001 μs (0.05%), N = 8, StdDev = 0.003 μs -Min = 2.386 μs, Q1 = 2.393 μs, Median = 2.395 μs, Q3 = 2.395 μs, Max = 2.396 μs -IQR = 0.002 μs, LowerFence = 2.389 μs, UpperFence = 2.399 μs -ConfidenceInterval = [2.387 μs; 2.400 μs] (CI 99.9%), Margin = 0.007 μs (0.28% of Mean) -Skewness = -1.01, Kurtosis = 2.22, MValue = 2 - -// ** Remained 2 (20,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 0m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_Xml --job "IterationCount=10, WarmupCount=3" --benchmarkId 8 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-KYXJCG(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 210042.00 ns, 210.0420 us/op -2026-01-13 18:49:20.643 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 39814875.00 ns, 39.8149 ms/op - -WorkloadPilot 1: 2 op, 90916.00 ns, 45.4580 us/op -WorkloadPilot 2: 3 op, 39750.00 ns, 13.2500 us/op -WorkloadPilot 3: 4 op, 43000.00 ns, 10.7500 us/op -WorkloadPilot 4: 5 op, 49541.00 ns, 9.9082 us/op -WorkloadPilot 5: 6 op, 58167.00 ns, 9.6945 us/op -WorkloadPilot 6: 7 op, 65833.00 ns, 9.4047 us/op -WorkloadPilot 7: 8 op, 79750.00 ns, 9.9688 us/op -WorkloadPilot 8: 9 op, 87250.00 ns, 9.6944 us/op -WorkloadPilot 9: 10 op, 98042.00 ns, 9.8042 us/op -WorkloadPilot 10: 11 op, 106000.00 ns, 9.6364 us/op -WorkloadPilot 11: 12 op, 109667.00 ns, 9.1389 us/op -WorkloadPilot 12: 13 op, 118708.00 ns, 9.1314 us/op -WorkloadPilot 13: 14 op, 159292.00 ns, 11.3780 us/op -WorkloadPilot 14: 15 op, 164917.00 ns, 10.9945 us/op -WorkloadPilot 15: 16 op, 155542.00 ns, 9.7214 us/op -WorkloadPilot 16: 32 op, 298542.00 ns, 9.3294 us/op -WorkloadPilot 17: 64 op, 571625.00 ns, 8.9316 us/op -WorkloadPilot 18: 128 op, 1152333.00 ns, 9.0026 us/op -WorkloadPilot 19: 256 op, 2434083.00 ns, 9.5081 us/op -WorkloadPilot 20: 512 op, 4721459.00 ns, 9.2216 us/op -WorkloadPilot 21: 1024 op, 10097292.00 ns, 9.8606 us/op -WorkloadPilot 22: 2048 op, 18953542.00 ns, 9.2547 us/op -WorkloadPilot 23: 4096 op, 36126458.00 ns, 8.8199 us/op -WorkloadPilot 24: 8192 op, 73763208.00 ns, 9.0043 us/op -WorkloadPilot 25: 16384 op, 160575292.00 ns, 9.8007 us/op -WorkloadPilot 26: 32768 op, 328501667.00 ns, 10.0251 us/op -WorkloadPilot 27: 65536 op, 220564667.00 ns, 3.3655 us/op -WorkloadPilot 28: 131072 op, 332576333.00 ns, 2.5374 us/op -WorkloadPilot 29: 262144 op, 662809959.00 ns, 2.5284 us/op - -WorkloadWarmup 1: 262144 op, 662347875.00 ns, 2.5267 us/op -WorkloadWarmup 2: 262144 op, 662608708.00 ns, 2.5277 us/op -WorkloadWarmup 3: 262144 op, 663753458.00 ns, 2.5320 us/op - -// BeforeActualRun -WorkloadActual 1: 262144 op, 662248208.00 ns, 2.5263 us/op -WorkloadActual 2: 262144 op, 663888250.00 ns, 2.5325 us/op -WorkloadActual 3: 262144 op, 662090542.00 ns, 2.5257 us/op -WorkloadActual 4: 262144 op, 661262291.00 ns, 2.5225 us/op -WorkloadActual 5: 262144 op, 663405042.00 ns, 2.5307 us/op -WorkloadActual 6: 262144 op, 660995417.00 ns, 2.5215 us/op -WorkloadActual 7: 262144 op, 661632792.00 ns, 2.5239 us/op -WorkloadActual 8: 262144 op, 661587042.00 ns, 2.5238 us/op -WorkloadActual 9: 262144 op, 664613166.00 ns, 2.5353 us/op -WorkloadActual 10: 262144 op, 663312750.00 ns, 2.5303 us/op - -// AfterActualRun -WorkloadResult 1: 262144 op, 662248208.00 ns, 2.5263 us/op -WorkloadResult 2: 262144 op, 663888250.00 ns, 2.5325 us/op -WorkloadResult 3: 262144 op, 662090542.00 ns, 2.5257 us/op -WorkloadResult 4: 262144 op, 661262291.00 ns, 2.5225 us/op -WorkloadResult 5: 262144 op, 663405042.00 ns, 2.5307 us/op -WorkloadResult 6: 262144 op, 660995417.00 ns, 2.5215 us/op -WorkloadResult 7: 262144 op, 661632792.00 ns, 2.5239 us/op -WorkloadResult 8: 262144 op, 661587042.00 ns, 2.5238 us/op -WorkloadResult 9: 262144 op, 664613166.00 ns, 2.5353 us/op -WorkloadResult 10: 262144 op, 663312750.00 ns, 2.5303 us/op -// GC: 190 1 0 1193355432 262144 -// Threading: 0 0 262144 - -// AfterAll -// Benchmark Process 9712 has exited with code 0. - -Mean = 2.527 μs, StdErr = 0.001 μs (0.06%), N = 10, StdDev = 0.005 μs -Min = 2.521 μs, Q1 = 2.524 μs, Median = 2.526 μs, Q3 = 2.531 μs, Max = 2.535 μs -IQR = 0.007 μs, LowerFence = 2.514 μs, UpperFence = 2.541 μs -ConfidenceInterval = [2.520 μs; 2.534 μs] (CI 99.9%), Margin = 0.007 μs (0.28% of Mean) -Skewness = 0.35, Kurtosis = 1.49, MValue = 2 - -// ** Remained 1 (10,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 0m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet d0c8be35-d8c8-4d0b-95e8-9b750b13885b.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_Xml --job "IterationCount=10, WarmupCount=3" --benchmarkId 9 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-INQKNJ(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 193708.00 ns, 193.7080 us/op -2026-01-13 18:49:32.039 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/d0c8be35-d8c8-4d0b-95e8-9b750b13885b/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 40245959.00 ns, 40.2460 ms/op - -WorkloadPilot 1: 2 op, 115834.00 ns, 57.9170 us/op -WorkloadPilot 2: 3 op, 48208.00 ns, 16.0693 us/op -WorkloadPilot 3: 4 op, 62667.00 ns, 15.6668 us/op -WorkloadPilot 4: 5 op, 122167.00 ns, 24.4334 us/op -WorkloadPilot 5: 6 op, 100709.00 ns, 16.7848 us/op -WorkloadPilot 6: 7 op, 122625.00 ns, 17.5179 us/op -WorkloadPilot 7: 8 op, 98625.00 ns, 12.3281 us/op -WorkloadPilot 8: 9 op, 105792.00 ns, 11.7547 us/op -WorkloadPilot 9: 10 op, 100416.00 ns, 10.0416 us/op -WorkloadPilot 10: 11 op, 115375.00 ns, 10.4886 us/op -WorkloadPilot 11: 12 op, 136250.00 ns, 11.3542 us/op -WorkloadPilot 12: 13 op, 126916.00 ns, 9.7628 us/op -WorkloadPilot 13: 14 op, 129833.00 ns, 9.2738 us/op -WorkloadPilot 14: 15 op, 156291.00 ns, 10.4194 us/op -WorkloadPilot 15: 16 op, 147625.00 ns, 9.2266 us/op -WorkloadPilot 16: 32 op, 287958.00 ns, 8.9987 us/op -WorkloadPilot 17: 64 op, 597625.00 ns, 9.3379 us/op -WorkloadPilot 18: 128 op, 1191166.00 ns, 9.3060 us/op -WorkloadPilot 19: 256 op, 2472208.00 ns, 9.6571 us/op -WorkloadPilot 20: 512 op, 4766166.00 ns, 9.3089 us/op -WorkloadPilot 21: 1024 op, 10104667.00 ns, 9.8678 us/op -WorkloadPilot 22: 2048 op, 19633875.00 ns, 9.5869 us/op -WorkloadPilot 23: 4096 op, 37341042.00 ns, 9.1165 us/op -WorkloadPilot 24: 8192 op, 77510083.00 ns, 9.4617 us/op -WorkloadPilot 25: 16384 op, 168054875.00 ns, 10.2573 us/op -WorkloadPilot 26: 32768 op, 326036084.00 ns, 9.9498 us/op -WorkloadPilot 27: 65536 op, 221216208.00 ns, 3.3755 us/op -WorkloadPilot 28: 131072 op, 336066625.00 ns, 2.5640 us/op -WorkloadPilot 29: 262144 op, 671116250.00 ns, 2.5601 us/op - -WorkloadWarmup 1: 262144 op, 670766375.00 ns, 2.5588 us/op -WorkloadWarmup 2: 262144 op, 669126042.00 ns, 2.5525 us/op -WorkloadWarmup 3: 262144 op, 671969500.00 ns, 2.5634 us/op - -// BeforeActualRun -WorkloadActual 1: 262144 op, 670443375.00 ns, 2.5575 us/op -WorkloadActual 2: 262144 op, 670706333.00 ns, 2.5585 us/op -WorkloadActual 3: 262144 op, 671379583.00 ns, 2.5611 us/op -WorkloadActual 4: 262144 op, 699001375.00 ns, 2.6665 us/op -WorkloadActual 5: 262144 op, 721573292.00 ns, 2.7526 us/op -WorkloadActual 6: 262144 op, 672450583.00 ns, 2.5652 us/op -WorkloadActual 7: 262144 op, 674026708.00 ns, 2.5712 us/op -WorkloadActual 8: 262144 op, 684076000.00 ns, 2.6095 us/op -WorkloadActual 9: 262144 op, 674778333.00 ns, 2.5741 us/op -WorkloadActual 10: 262144 op, 669776250.00 ns, 2.5550 us/op - -// AfterActualRun -WorkloadResult 1: 262144 op, 670443375.00 ns, 2.5575 us/op -WorkloadResult 2: 262144 op, 670706333.00 ns, 2.5585 us/op -WorkloadResult 3: 262144 op, 671379583.00 ns, 2.5611 us/op -WorkloadResult 4: 262144 op, 672450583.00 ns, 2.5652 us/op -WorkloadResult 5: 262144 op, 674026708.00 ns, 2.5712 us/op -WorkloadResult 6: 262144 op, 684076000.00 ns, 2.6095 us/op -WorkloadResult 7: 262144 op, 674778333.00 ns, 2.5741 us/op -WorkloadResult 8: 262144 op, 669776250.00 ns, 2.5550 us/op -// GC: 190 1 0 1193355432 262144 -// Threading: 0 0 262144 - -// AfterAll -// Benchmark Process 9718 has exited with code 0. - -Mean = 2.569 μs, StdErr = 0.006 μs (0.24%), N = 8, StdDev = 0.018 μs -Min = 2.555 μs, Q1 = 2.558 μs, Median = 2.563 μs, Q3 = 2.572 μs, Max = 2.610 μs -IQR = 0.014 μs, LowerFence = 2.538 μs, UpperFence = 2.592 μs -ConfidenceInterval = [2.535 μs; 2.603 μs] (CI 99.9%), Margin = 0.034 μs (1.32% of Mean) -Skewness = 1.37, Kurtosis = 3.54, MValue = 2 - -// ** Remained 0 (0,0%) benchmark(s) to run. Estimated finish 2026-01-13 18:49 (0h 0m from now) ** -// ***** BenchmarkRunner: Finish ***** - -// * Export * - BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report.csv - BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report-github.md - BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report.html - -// * Detailed results * -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 1.991 μs, StdErr = 0.001 μs (0.06%), N = 8, StdDev = 0.004 μs -Min = 1.985 μs, Q1 = 1.988 μs, Median = 1.992 μs, Q3 = 1.993 μs, Max = 1.995 μs -IQR = 0.005 μs, LowerFence = 1.980 μs, UpperFence = 2.001 μs -ConfidenceInterval = [1.984 μs; 1.998 μs] (CI 99.9%), Margin = 0.007 μs (0.35% of Mean) -Skewness = -0.28, Kurtosis = 1.38, MValue = 2 --------------------- Histogram -------------------- -[1.983 μs ; 1.998 μs) | @@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 2.041 μs, StdErr = 0.001 μs (0.05%), N = 8, StdDev = 0.003 μs -Min = 2.037 μs, Q1 = 2.040 μs, Median = 2.040 μs, Q3 = 2.042 μs, Max = 2.046 μs -IQR = 0.002 μs, LowerFence = 2.036 μs, UpperFence = 2.045 μs -ConfidenceInterval = [2.036 μs; 2.046 μs] (CI 99.9%), Margin = 0.005 μs (0.26% of Mean) -Skewness = 0.59, Kurtosis = 1.93, MValue = 2 --------------------- Histogram -------------------- -[2.036 μs ; 2.048 μs) | @@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 3.495 μs, StdErr = 0.003 μs (0.08%), N = 10, StdDev = 0.009 μs -Min = 3.480 μs, Q1 = 3.489 μs, Median = 3.496 μs, Q3 = 3.499 μs, Max = 3.513 μs -IQR = 0.010 μs, LowerFence = 3.474 μs, UpperFence = 3.514 μs -ConfidenceInterval = [3.481 μs; 3.509 μs] (CI 99.9%), Margin = 0.014 μs (0.40% of Mean) -Skewness = 0.23, Kurtosis = 2.25, MValue = 2 --------------------- Histogram -------------------- -[3.474 μs ; 3.519 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 3.533 μs, StdErr = 0.003 μs (0.09%), N = 9, StdDev = 0.009 μs -Min = 3.521 μs, Q1 = 3.526 μs, Median = 3.531 μs, Q3 = 3.540 μs, Max = 3.547 μs -IQR = 0.014 μs, LowerFence = 3.504 μs, UpperFence = 3.562 μs -ConfidenceInterval = [3.518 μs; 3.549 μs] (CI 99.9%), Margin = 0.016 μs (0.44% of Mean) -Skewness = 0.25, Kurtosis = 1.35, MValue = 2 --------------------- Histogram -------------------- -[3.516 μs ; 3.553 μs) | @@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 56.812 μs, StdErr = 0.066 μs (0.12%), N = 9, StdDev = 0.198 μs -Min = 56.444 μs, Q1 = 56.702 μs, Median = 56.855 μs, Q3 = 56.919 μs, Max = 57.155 μs -IQR = 0.217 μs, LowerFence = 56.376 μs, UpperFence = 57.245 μs -ConfidenceInterval = [56.480 μs; 57.144 μs] (CI 99.9%), Margin = 0.332 μs (0.58% of Mean) -Skewness = -0.13, Kurtosis = 2.4, MValue = 2 --------------------- Histogram -------------------- -[56.319 μs ; 57.280 μs) | @@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 56.938 μs, StdErr = 0.067 μs (0.12%), N = 10, StdDev = 0.212 μs -Min = 56.550 μs, Q1 = 56.826 μs, Median = 56.909 μs, Q3 = 57.068 μs, Max = 57.308 μs -IQR = 0.241 μs, LowerFence = 56.464 μs, UpperFence = 57.430 μs -ConfidenceInterval = [56.618 μs; 57.259 μs] (CI 99.9%), Margin = 0.321 μs (0.56% of Mean) -Skewness = -0.04, Kurtosis = 2.17, MValue = 2 --------------------- Histogram -------------------- -[56.421 μs ; 57.437 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 2.357 μs, StdErr = 0.003 μs (0.14%), N = 10, StdDev = 0.010 μs -Min = 2.347 μs, Q1 = 2.349 μs, Median = 2.356 μs, Q3 = 2.361 μs, Max = 2.378 μs -IQR = 0.012 μs, LowerFence = 2.330 μs, UpperFence = 2.380 μs -ConfidenceInterval = [2.342 μs; 2.372 μs] (CI 99.9%), Margin = 0.015 μs (0.65% of Mean) -Skewness = 0.78, Kurtosis = 2.39, MValue = 2 --------------------- Histogram -------------------- -[2.341 μs ; 2.385 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 2.393 μs, StdErr = 0.001 μs (0.05%), N = 8, StdDev = 0.003 μs -Min = 2.386 μs, Q1 = 2.393 μs, Median = 2.395 μs, Q3 = 2.395 μs, Max = 2.396 μs -IQR = 0.002 μs, LowerFence = 2.389 μs, UpperFence = 2.399 μs -ConfidenceInterval = [2.387 μs; 2.400 μs] (CI 99.9%), Margin = 0.007 μs (0.28% of Mean) -Skewness = -1.01, Kurtosis = 2.22, MValue = 2 --------------------- Histogram -------------------- -[2.384 μs ; 2.398 μs) | @@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 2.527 μs, StdErr = 0.001 μs (0.06%), N = 10, StdDev = 0.005 μs -Min = 2.521 μs, Q1 = 2.524 μs, Median = 2.526 μs, Q3 = 2.531 μs, Max = 2.535 μs -IQR = 0.007 μs, LowerFence = 2.514 μs, UpperFence = 2.541 μs -ConfidenceInterval = [2.520 μs; 2.534 μs] (CI 99.9%), Margin = 0.007 μs (0.28% of Mean) -Skewness = 0.35, Kurtosis = 1.49, MValue = 2 --------------------- Histogram -------------------- -[2.519 μs ; 2.538 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-AHWFFF(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 2.569 μs, StdErr = 0.006 μs (0.24%), N = 8, StdDev = 0.018 μs -Min = 2.555 μs, Q1 = 2.558 μs, Median = 2.563 μs, Q3 = 2.572 μs, Max = 2.610 μs -IQR = 0.014 μs, LowerFence = 2.538 μs, UpperFence = 2.592 μs -ConfidenceInterval = [2.535 μs; 2.603 μs] (CI 99.9%), Margin = 0.034 μs (1.32% of Mean) -Skewness = 1.37, Kurtosis = 3.54, MValue = 2 --------------------- Histogram -------------------- -[2.543 μs ; 2.621 μs) | @@@@@@@@ ---------------------------------------------------- - -// * Summary * - -BenchmarkDotNet v0.14.0, macOS 26.2 (25C56) [Darwin 25.2.0] -Apple M1 Ultra, 1 CPU, 20 logical and 20 physical cores -.NET SDK 10.0.101 - [Host] : .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD - Job-AHWFFF : .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD - -IterationCount=10 WarmupCount=3 - -| Method | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Gen1 | Allocated | Alloc Ratio | -|------------------------------------------ |----------:|----------:|----------:|------:|--------:|--------:|-------:|----------:|------------:| -| 'Permissive mode - Small JSON payload' | 1.991 μs | 0.0069 μs | 0.0036 μs | 0.77 | 0.01 | 0.6638 | 0.0038 | 4.08 KB | 0.92 | -| 'Strict mode - Small JSON payload' | 2.041 μs | 0.0053 μs | 0.0028 μs | 0.79 | 0.01 | 0.6638 | 0.0038 | 4.08 KB | 0.92 | -| 'Permissive mode - Medium JSON payload' | 3.495 μs | 0.0140 μs | 0.0093 μs | 1.36 | 0.01 | 1.1559 | 0.0114 | 7.09 KB | 1.59 | -| 'Strict mode - Medium JSON payload' | 3.533 μs | 0.0156 μs | 0.0093 μs | 1.38 | 0.01 | 1.1559 | 0.0114 | 7.09 KB | 1.59 | -| 'Permissive mode - Large JSON payload' | 56.812 μs | 0.3320 μs | 0.1975 μs | 22.11 | 0.16 | 20.8130 | 5.1880 | 128.02 KB | 28.80 | -| 'Strict mode - Large JSON payload' | 56.938 μs | 0.3207 μs | 0.2121 μs | 22.16 | 0.16 | 20.8130 | 5.1880 | 128.02 KB | 28.80 | -| 'Permissive mode - Base64 binary payload' | 2.357 μs | 0.0153 μs | 0.0101 μs | 0.92 | 0.01 | 0.7172 | 0.0076 | 4.41 KB | 0.99 | -| 'Strict mode - Base64 binary payload' | 2.393 μs | 0.0067 μs | 0.0035 μs | 0.93 | 0.01 | 0.7172 | 0.0076 | 4.41 KB | 0.99 | -| 'Permissive mode - XML payload' | 2.527 μs | 0.0071 μs | 0.0047 μs | 0.98 | 0.01 | 0.7248 | 0.0038 | 4.45 KB | 1.00 | -| 'Strict mode - XML payload' | 2.569 μs | 0.0338 μs | 0.0177 μs | 1.00 | 0.01 | 0.7248 | 0.0038 | 4.45 KB | 1.00 | - -// * Hints * -Outliers - CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': IterationCount=10, WarmupCount=3 -> 2 outliers were removed (2.01 μs, 2.03 μs) - CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': IterationCount=10, WarmupCount=3 -> 2 outliers were removed (2.06 μs, 2.07 μs) - CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': IterationCount=10, WarmupCount=3 -> 1 outlier was removed (3.58 μs) - CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': IterationCount=10, WarmupCount=3 -> 1 outlier was removed (57.28 μs) - CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': IterationCount=10, WarmupCount=3 -> 2 outliers were removed, 4 outliers were detected (2.39 μs, 2.39 μs, 2.40 μs, 2.42 μs) - CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': IterationCount=10, WarmupCount=3 -> 2 outliers were removed (2.67 μs, 2.75 μs) - -// * Legends * - Mean : Arithmetic mean of all measurements - Error : Half of 99.9% confidence interval - StdDev : Standard deviation of all measurements - Ratio : Mean of the ratio distribution ([Current]/[Baseline]) - RatioSD : Standard deviation of the ratio distribution ([Current]/[Baseline]) - Gen0 : GC Generation 0 collects per 1000 operations - Gen1 : GC Generation 1 collects per 1000 operations - Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B) - Alloc Ratio : Allocated memory ratio distribution ([Current]/[Baseline]) - 1 μs : 1 Microsecond (0.000001 sec) - -// * Diagnostic Output - MemoryDiagnoser * - - -// ***** BenchmarkRunner: End ***** -Run time: 00:02:06 (126.01 sec), executed benchmarks: 10 - -Global total time: 00:02:15 (135.01 sec), executed benchmarks: 10 -// * Artifacts cleanup * -Artifacts cleanup is finished diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-210159.log b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-210159.log deleted file mode 100644 index 60474fc..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/BenchmarkDotNet.Artifacts/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-20260113-210159.log +++ /dev/null @@ -1,1078 +0,0 @@ -// Validating benchmarks: -// ***** BenchmarkRunner: Start ***** -// ***** Found 10 benchmark(s) in total ***** -// ***** Building 1 exe(s) in Parallel: Start ***** -// start dotnet restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:IntermediateOutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/obj/Release/net10.0/" /p:OutDir="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/" /p:OutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/" in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667 -// command took 0.78 sec and exited with 0 -// start dotnet build -c Release --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:IntermediateOutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/obj/Release/net10.0/" /p:OutDir="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/" /p:OutputPath="/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/" --output "/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/" in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667 -// command took 7.99 sec and exited with 0 -// ***** Done, took 00:00:08 (8.83 sec) ***** -// Found 10 benchmarks: -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) - -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_SmallJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 0 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-GOQIEV(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 207541.00 ns, 207.5410 us/op -2026-01-13 21:02:08.446 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 38068292.00 ns, 38.0683 ms/op - -WorkloadPilot 1: 2 op, 117000.00 ns, 58.5000 us/op -WorkloadPilot 2: 3 op, 46083.00 ns, 15.3610 us/op -WorkloadPilot 3: 4 op, 45500.00 ns, 11.3750 us/op -WorkloadPilot 4: 5 op, 39334.00 ns, 7.8668 us/op -WorkloadPilot 5: 6 op, 32000.00 ns, 5.3333 us/op -WorkloadPilot 6: 7 op, 34750.00 ns, 4.9643 us/op -WorkloadPilot 7: 8 op, 38334.00 ns, 4.7918 us/op -WorkloadPilot 8: 9 op, 42292.00 ns, 4.6991 us/op -WorkloadPilot 9: 10 op, 72500.00 ns, 7.2500 us/op -WorkloadPilot 10: 11 op, 134958.00 ns, 12.2689 us/op -WorkloadPilot 11: 12 op, 77500.00 ns, 6.4583 us/op -WorkloadPilot 12: 13 op, 68625.00 ns, 5.2788 us/op -WorkloadPilot 13: 14 op, 67291.00 ns, 4.8065 us/op -WorkloadPilot 14: 15 op, 76459.00 ns, 5.0973 us/op -WorkloadPilot 15: 16 op, 71500.00 ns, 4.4688 us/op -WorkloadPilot 16: 32 op, 148917.00 ns, 4.6537 us/op -WorkloadPilot 17: 64 op, 291125.00 ns, 4.5488 us/op -WorkloadPilot 18: 128 op, 595209.00 ns, 4.6501 us/op -WorkloadPilot 19: 256 op, 1126458.00 ns, 4.4002 us/op -WorkloadPilot 20: 512 op, 2153917.00 ns, 4.2069 us/op -WorkloadPilot 21: 1024 op, 4725208.00 ns, 4.6145 us/op -WorkloadPilot 22: 2048 op, 9662917.00 ns, 4.7182 us/op -WorkloadPilot 23: 4096 op, 18008042.00 ns, 4.3965 us/op -WorkloadPilot 24: 8192 op, 36305250.00 ns, 4.4318 us/op -WorkloadPilot 25: 16384 op, 72030083.00 ns, 4.3964 us/op -WorkloadPilot 26: 32768 op, 146810125.00 ns, 4.4803 us/op -WorkloadPilot 27: 65536 op, 323392125.00 ns, 4.9346 us/op -WorkloadPilot 28: 131072 op, 217264666.00 ns, 1.6576 us/op -WorkloadPilot 29: 262144 op, 359248208.00 ns, 1.3704 us/op -WorkloadPilot 30: 524288 op, 720317416.00 ns, 1.3739 us/op - -WorkloadWarmup 1: 524288 op, 732052916.00 ns, 1.3963 us/op -WorkloadWarmup 2: 524288 op, 719301792.00 ns, 1.3720 us/op -WorkloadWarmup 3: 524288 op, 725888458.00 ns, 1.3845 us/op - -// BeforeActualRun -WorkloadActual 1: 524288 op, 717379208.00 ns, 1.3683 us/op -WorkloadActual 2: 524288 op, 715617750.00 ns, 1.3649 us/op -WorkloadActual 3: 524288 op, 720504458.00 ns, 1.3743 us/op -WorkloadActual 4: 524288 op, 714381875.00 ns, 1.3626 us/op -WorkloadActual 5: 524288 op, 719364958.00 ns, 1.3721 us/op -WorkloadActual 6: 524288 op, 718320000.00 ns, 1.3701 us/op -WorkloadActual 7: 524288 op, 711796084.00 ns, 1.3576 us/op -WorkloadActual 8: 524288 op, 719132167.00 ns, 1.3716 us/op -WorkloadActual 9: 524288 op, 710407542.00 ns, 1.3550 us/op -WorkloadActual 10: 524288 op, 718937084.00 ns, 1.3713 us/op - -// AfterActualRun -WorkloadResult 1: 524288 op, 717379208.00 ns, 1.3683 us/op -WorkloadResult 2: 524288 op, 715617750.00 ns, 1.3649 us/op -WorkloadResult 3: 524288 op, 720504458.00 ns, 1.3743 us/op -WorkloadResult 4: 524288 op, 714381875.00 ns, 1.3626 us/op -WorkloadResult 5: 524288 op, 719364958.00 ns, 1.3721 us/op -WorkloadResult 6: 524288 op, 718320000.00 ns, 1.3701 us/op -WorkloadResult 7: 524288 op, 711796084.00 ns, 1.3576 us/op -WorkloadResult 8: 524288 op, 719132167.00 ns, 1.3716 us/op -WorkloadResult 9: 524288 op, 710407542.00 ns, 1.3550 us/op -WorkloadResult 10: 524288 op, 718937084.00 ns, 1.3713 us/op -// GC: 277 1 0 1740746208 524288 -// Threading: 0 0 524288 - -// AfterAll -// Benchmark Process 14410 has exited with code 0. - -Mean = 1.367 μs, StdErr = 0.002 μs (0.15%), N = 10, StdDev = 0.007 μs -Min = 1.355 μs, Q1 = 1.363 μs, Median = 1.369 μs, Q3 = 1.372 μs, Max = 1.374 μs -IQR = 0.008 μs, LowerFence = 1.351 μs, UpperFence = 1.384 μs -ConfidenceInterval = [1.357 μs; 1.377 μs] (CI 99.9%), Margin = 0.010 μs (0.72% of Mean) -Skewness = -0.6, Kurtosis = 1.73, MValue = 2 - -// ** Remained 9 (90,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 1m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_SmallJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 1 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-TVPIMQ(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 172375.00 ns, 172.3750 us/op -2026-01-13 21:02:20.712 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 40745375.00 ns, 40.7454 ms/op - -WorkloadPilot 1: 2 op, 60833.00 ns, 30.4165 us/op -WorkloadPilot 2: 3 op, 23875.00 ns, 7.9583 us/op -WorkloadPilot 3: 4 op, 38542.00 ns, 9.6355 us/op -WorkloadPilot 4: 5 op, 32917.00 ns, 6.5834 us/op -WorkloadPilot 5: 6 op, 58041.00 ns, 9.6735 us/op -WorkloadPilot 6: 7 op, 61750.00 ns, 8.8214 us/op -WorkloadPilot 7: 8 op, 55375.00 ns, 6.9219 us/op -WorkloadPilot 8: 9 op, 47500.00 ns, 5.2778 us/op -WorkloadPilot 9: 10 op, 52666.00 ns, 5.2666 us/op -WorkloadPilot 10: 11 op, 69709.00 ns, 6.3372 us/op -WorkloadPilot 11: 12 op, 64958.00 ns, 5.4132 us/op -WorkloadPilot 12: 13 op, 67541.00 ns, 5.1955 us/op -WorkloadPilot 13: 14 op, 83458.00 ns, 5.9613 us/op -WorkloadPilot 14: 15 op, 75292.00 ns, 5.0195 us/op -WorkloadPilot 15: 16 op, 78375.00 ns, 4.8984 us/op -WorkloadPilot 16: 32 op, 198625.00 ns, 6.2070 us/op -WorkloadPilot 17: 64 op, 300709.00 ns, 4.6986 us/op -WorkloadPilot 18: 128 op, 595125.00 ns, 4.6494 us/op -WorkloadPilot 19: 256 op, 1119875.00 ns, 4.3745 us/op -WorkloadPilot 20: 512 op, 2301667.00 ns, 4.4954 us/op -WorkloadPilot 21: 1024 op, 4792125.00 ns, 4.6798 us/op -WorkloadPilot 22: 2048 op, 10016250.00 ns, 4.8907 us/op -WorkloadPilot 23: 4096 op, 18613958.00 ns, 4.5444 us/op -WorkloadPilot 24: 8192 op, 38010167.00 ns, 4.6399 us/op -WorkloadPilot 25: 16384 op, 76626250.00 ns, 4.6769 us/op -WorkloadPilot 26: 32768 op, 169438000.00 ns, 5.1708 us/op -WorkloadPilot 27: 65536 op, 272264542.00 ns, 4.1544 us/op -WorkloadPilot 28: 131072 op, 193921625.00 ns, 1.4795 us/op -WorkloadPilot 29: 262144 op, 371248291.00 ns, 1.4162 us/op -WorkloadPilot 30: 524288 op, 742296291.00 ns, 1.4158 us/op - -WorkloadWarmup 1: 524288 op, 744202792.00 ns, 1.4195 us/op -WorkloadWarmup 2: 524288 op, 745451542.00 ns, 1.4218 us/op -WorkloadWarmup 3: 524288 op, 749004209.00 ns, 1.4286 us/op - -// BeforeActualRun -WorkloadActual 1: 524288 op, 738262250.00 ns, 1.4081 us/op -WorkloadActual 2: 524288 op, 743777292.00 ns, 1.4186 us/op -WorkloadActual 3: 524288 op, 736863208.00 ns, 1.4055 us/op -WorkloadActual 4: 524288 op, 740554709.00 ns, 1.4125 us/op -WorkloadActual 5: 524288 op, 744649167.00 ns, 1.4203 us/op -WorkloadActual 6: 524288 op, 739170583.00 ns, 1.4099 us/op -WorkloadActual 7: 524288 op, 744343750.00 ns, 1.4197 us/op -WorkloadActual 8: 524288 op, 736525375.00 ns, 1.4048 us/op -WorkloadActual 9: 524288 op, 744202416.00 ns, 1.4195 us/op -WorkloadActual 10: 524288 op, 745787250.00 ns, 1.4225 us/op - -// AfterActualRun -WorkloadResult 1: 524288 op, 738262250.00 ns, 1.4081 us/op -WorkloadResult 2: 524288 op, 743777292.00 ns, 1.4186 us/op -WorkloadResult 3: 524288 op, 736863208.00 ns, 1.4055 us/op -WorkloadResult 4: 524288 op, 740554709.00 ns, 1.4125 us/op -WorkloadResult 5: 524288 op, 744649167.00 ns, 1.4203 us/op -WorkloadResult 6: 524288 op, 739170583.00 ns, 1.4099 us/op -WorkloadResult 7: 524288 op, 744343750.00 ns, 1.4197 us/op -WorkloadResult 8: 524288 op, 736525375.00 ns, 1.4048 us/op -WorkloadResult 9: 524288 op, 744202416.00 ns, 1.4195 us/op -WorkloadResult 10: 524288 op, 745787250.00 ns, 1.4225 us/op -// GC: 277 1 0 1740746208 524288 -// Threading: 0 0 524288 - -// AfterAll -// Benchmark Process 14416 has exited with code 0. - -Mean = 1.414 μs, StdErr = 0.002 μs (0.15%), N = 10, StdDev = 0.007 μs -Min = 1.405 μs, Q1 = 1.409 μs, Median = 1.416 μs, Q3 = 1.420 μs, Max = 1.422 μs -IQR = 0.011 μs, LowerFence = 1.392 μs, UpperFence = 1.436 μs -ConfidenceInterval = [1.404 μs; 1.424 μs] (CI 99.9%), Margin = 0.010 μs (0.72% of Mean) -Skewness = -0.17, Kurtosis = 1.14, MValue = 2 - -// ** Remained 8 (80,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 1m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_MediumJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 2 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-NEZGTD(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 209750.00 ns, 209.7500 us/op -2026-01-13 21:02:33.254 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 40149250.00 ns, 40.1493 ms/op - -WorkloadPilot 1: 2 op, 81250.00 ns, 40.6250 us/op -WorkloadPilot 2: 3 op, 42083.00 ns, 14.0277 us/op -WorkloadPilot 3: 4 op, 45417.00 ns, 11.3543 us/op -WorkloadPilot 4: 5 op, 41583.00 ns, 8.3166 us/op -WorkloadPilot 5: 6 op, 42541.00 ns, 7.0902 us/op -WorkloadPilot 6: 7 op, 48917.00 ns, 6.9881 us/op -WorkloadPilot 7: 8 op, 53208.00 ns, 6.6510 us/op -WorkloadPilot 8: 9 op, 59292.00 ns, 6.5880 us/op -WorkloadPilot 9: 10 op, 64542.00 ns, 6.4542 us/op -WorkloadPilot 10: 11 op, 70292.00 ns, 6.3902 us/op -WorkloadPilot 11: 12 op, 79375.00 ns, 6.6146 us/op -WorkloadPilot 12: 13 op, 86750.00 ns, 6.6731 us/op -WorkloadPilot 13: 14 op, 104625.00 ns, 7.4732 us/op -WorkloadPilot 14: 15 op, 105250.00 ns, 7.0167 us/op -WorkloadPilot 15: 16 op, 104750.00 ns, 6.5469 us/op -WorkloadPilot 16: 32 op, 205125.00 ns, 6.4102 us/op -WorkloadPilot 17: 64 op, 416709.00 ns, 6.5111 us/op -WorkloadPilot 18: 128 op, 870375.00 ns, 6.7998 us/op -WorkloadPilot 19: 256 op, 1778167.00 ns, 6.9460 us/op -WorkloadPilot 20: 512 op, 3291625.00 ns, 6.4290 us/op -WorkloadPilot 21: 1024 op, 6822125.00 ns, 6.6622 us/op -WorkloadPilot 22: 2048 op, 13684500.00 ns, 6.6819 us/op -WorkloadPilot 23: 4096 op, 26236125.00 ns, 6.4053 us/op -WorkloadPilot 24: 8192 op, 50069583.00 ns, 6.1120 us/op -WorkloadPilot 25: 16384 op, 102843416.00 ns, 6.2771 us/op -WorkloadPilot 26: 32768 op, 236654000.00 ns, 7.2221 us/op -WorkloadPilot 27: 65536 op, 295246833.00 ns, 4.5051 us/op -WorkloadPilot 28: 131072 op, 271657708.00 ns, 2.0726 us/op -WorkloadPilot 29: 262144 op, 538970458.00 ns, 2.0560 us/op - -WorkloadWarmup 1: 262144 op, 538782625.00 ns, 2.0553 us/op -WorkloadWarmup 2: 262144 op, 534848584.00 ns, 2.0403 us/op -WorkloadWarmup 3: 262144 op, 546599541.00 ns, 2.0851 us/op - -// BeforeActualRun -WorkloadActual 1: 262144 op, 538027959.00 ns, 2.0524 us/op -WorkloadActual 2: 262144 op, 539241083.00 ns, 2.0570 us/op -WorkloadActual 3: 262144 op, 539895583.00 ns, 2.0595 us/op -WorkloadActual 4: 262144 op, 536867375.00 ns, 2.0480 us/op -WorkloadActual 5: 262144 op, 538689583.00 ns, 2.0549 us/op -WorkloadActual 6: 262144 op, 534301875.00 ns, 2.0382 us/op -WorkloadActual 7: 262144 op, 541572833.00 ns, 2.0659 us/op -WorkloadActual 8: 262144 op, 536549166.00 ns, 2.0468 us/op -WorkloadActual 9: 262144 op, 539108584.00 ns, 2.0565 us/op -WorkloadActual 10: 262144 op, 537123834.00 ns, 2.0490 us/op - -// AfterActualRun -WorkloadResult 1: 262144 op, 538027959.00 ns, 2.0524 us/op -WorkloadResult 2: 262144 op, 539241083.00 ns, 2.0570 us/op -WorkloadResult 3: 262144 op, 539895583.00 ns, 2.0595 us/op -WorkloadResult 4: 262144 op, 536867375.00 ns, 2.0480 us/op -WorkloadResult 5: 262144 op, 538689583.00 ns, 2.0549 us/op -WorkloadResult 6: 262144 op, 534301875.00 ns, 2.0382 us/op -WorkloadResult 7: 262144 op, 541572833.00 ns, 2.0659 us/op -WorkloadResult 8: 262144 op, 536549166.00 ns, 2.0468 us/op -WorkloadResult 9: 262144 op, 539108584.00 ns, 2.0565 us/op -WorkloadResult 10: 262144 op, 537123834.00 ns, 2.0490 us/op -// GC: 175 1 0 1098977712 262144 -// Threading: 0 0 262144 - -// AfterAll -// Benchmark Process 14421 has exited with code 0. - -Mean = 2.053 μs, StdErr = 0.002 μs (0.12%), N = 10, StdDev = 0.008 μs -Min = 2.038 μs, Q1 = 2.048 μs, Median = 2.054 μs, Q3 = 2.057 μs, Max = 2.066 μs -IQR = 0.009 μs, LowerFence = 2.035 μs, UpperFence = 2.070 μs -ConfidenceInterval = [2.041 μs; 2.065 μs] (CI 99.9%), Margin = 0.012 μs (0.57% of Mean) -Skewness = -0.18, Kurtosis = 2.21, MValue = 2 - -// ** Remained 7 (70,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 1m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_MediumJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 3 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-IPURDY(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 255875.00 ns, 255.8750 us/op -2026-01-13 21:02:42.593 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 39160583.00 ns, 39.1606 ms/op - -WorkloadPilot 1: 2 op, 73583.00 ns, 36.7915 us/op -WorkloadPilot 2: 3 op, 29541.00 ns, 9.8470 us/op -WorkloadPilot 3: 4 op, 32041.00 ns, 8.0103 us/op -WorkloadPilot 4: 5 op, 37375.00 ns, 7.4750 us/op -WorkloadPilot 5: 6 op, 43292.00 ns, 7.2153 us/op -WorkloadPilot 6: 7 op, 50292.00 ns, 7.1846 us/op -WorkloadPilot 7: 8 op, 77042.00 ns, 9.6303 us/op -WorkloadPilot 8: 9 op, 122042.00 ns, 13.5602 us/op -WorkloadPilot 9: 10 op, 126167.00 ns, 12.6167 us/op -WorkloadPilot 10: 11 op, 132291.00 ns, 12.0265 us/op -WorkloadPilot 11: 12 op, 92208.00 ns, 7.6840 us/op -WorkloadPilot 12: 13 op, 114958.00 ns, 8.8429 us/op -WorkloadPilot 13: 14 op, 101042.00 ns, 7.2173 us/op -WorkloadPilot 14: 15 op, 107167.00 ns, 7.1445 us/op -WorkloadPilot 15: 16 op, 121500.00 ns, 7.5938 us/op -WorkloadPilot 16: 32 op, 209042.00 ns, 6.5326 us/op -WorkloadPilot 17: 64 op, 421208.00 ns, 6.5814 us/op -WorkloadPilot 18: 128 op, 846291.00 ns, 6.6116 us/op -WorkloadPilot 19: 256 op, 1684666.00 ns, 6.5807 us/op -WorkloadPilot 20: 512 op, 3477208.00 ns, 6.7914 us/op -WorkloadPilot 21: 1024 op, 6973917.00 ns, 6.8105 us/op -WorkloadPilot 22: 2048 op, 14047875.00 ns, 6.8593 us/op -WorkloadPilot 23: 4096 op, 27163792.00 ns, 6.6318 us/op -WorkloadPilot 24: 8192 op, 54539667.00 ns, 6.6577 us/op -WorkloadPilot 25: 16384 op, 109565959.00 ns, 6.6874 us/op -WorkloadPilot 26: 32768 op, 249143917.00 ns, 7.6033 us/op -WorkloadPilot 27: 65536 op, 205214209.00 ns, 3.1313 us/op -WorkloadPilot 28: 131072 op, 280282541.00 ns, 2.1384 us/op -WorkloadPilot 29: 262144 op, 553053541.00 ns, 2.1097 us/op - -WorkloadWarmup 1: 262144 op, 558106334.00 ns, 2.1290 us/op -WorkloadWarmup 2: 262144 op, 552402083.00 ns, 2.1072 us/op -WorkloadWarmup 3: 262144 op, 557108292.00 ns, 2.1252 us/op - -// BeforeActualRun -WorkloadActual 1: 262144 op, 552485833.00 ns, 2.1076 us/op -WorkloadActual 2: 262144 op, 557535875.00 ns, 2.1268 us/op -WorkloadActual 3: 262144 op, 555799792.00 ns, 2.1202 us/op -WorkloadActual 4: 262144 op, 552434709.00 ns, 2.1074 us/op -WorkloadActual 5: 262144 op, 557385208.00 ns, 2.1263 us/op -WorkloadActual 6: 262144 op, 556614208.00 ns, 2.1233 us/op -WorkloadActual 7: 262144 op, 552271334.00 ns, 2.1067 us/op -WorkloadActual 8: 262144 op, 558348834.00 ns, 2.1299 us/op -WorkloadActual 9: 262144 op, 554299125.00 ns, 2.1145 us/op -WorkloadActual 10: 262144 op, 560411333.00 ns, 2.1378 us/op - -// AfterActualRun -WorkloadResult 1: 262144 op, 552485833.00 ns, 2.1076 us/op -WorkloadResult 2: 262144 op, 557535875.00 ns, 2.1268 us/op -WorkloadResult 3: 262144 op, 555799792.00 ns, 2.1202 us/op -WorkloadResult 4: 262144 op, 552434709.00 ns, 2.1074 us/op -WorkloadResult 5: 262144 op, 557385208.00 ns, 2.1263 us/op -WorkloadResult 6: 262144 op, 556614208.00 ns, 2.1233 us/op -WorkloadResult 7: 262144 op, 552271334.00 ns, 2.1067 us/op -WorkloadResult 8: 262144 op, 558348834.00 ns, 2.1299 us/op -WorkloadResult 9: 262144 op, 554299125.00 ns, 2.1145 us/op -WorkloadResult 10: 262144 op, 560411333.00 ns, 2.1378 us/op -// GC: 175 1 0 1098977712 262144 -// Threading: 0 0 262144 - -// AfterAll -// Benchmark Process 14425 has exited with code 0. - -Mean = 2.120 μs, StdErr = 0.003 μs (0.16%), N = 10, StdDev = 0.011 μs -Min = 2.107 μs, Q1 = 2.109 μs, Median = 2.122 μs, Q3 = 2.127 μs, Max = 2.138 μs -IQR = 0.017 μs, LowerFence = 2.083 μs, UpperFence = 2.153 μs -ConfidenceInterval = [2.104 μs; 2.136 μs] (CI 99.9%), Margin = 0.016 μs (0.76% of Mean) -Skewness = 0.05, Kurtosis = 1.48, MValue = 2 - -// ** Remained 6 (60,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:03 (0h 1m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_LargeJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 4 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-RUUBDF(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 190541.00 ns, 190.5410 us/op -2026-01-13 21:02:52.140 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 37636916.00 ns, 37.6369 ms/op - -WorkloadPilot 1: 2 op, 219000.00 ns, 109.5000 us/op -WorkloadPilot 2: 3 op, 253625.00 ns, 84.5417 us/op -WorkloadPilot 3: 4 op, 974083.00 ns, 243.5208 us/op -WorkloadPilot 4: 5 op, 400500.00 ns, 80.1000 us/op -WorkloadPilot 5: 6 op, 475834.00 ns, 79.3057 us/op -WorkloadPilot 6: 7 op, 537917.00 ns, 76.8453 us/op -WorkloadPilot 7: 8 op, 585292.00 ns, 73.1615 us/op -WorkloadPilot 8: 9 op, 678750.00 ns, 75.4167 us/op -WorkloadPilot 9: 10 op, 738875.00 ns, 73.8875 us/op -WorkloadPilot 10: 11 op, 917000.00 ns, 83.3636 us/op -WorkloadPilot 11: 12 op, 959375.00 ns, 79.9479 us/op -WorkloadPilot 12: 13 op, 963166.00 ns, 74.0897 us/op -WorkloadPilot 13: 14 op, 1038000.00 ns, 74.1429 us/op -WorkloadPilot 14: 15 op, 1190125.00 ns, 79.3417 us/op -WorkloadPilot 15: 16 op, 1221542.00 ns, 76.3464 us/op -WorkloadPilot 16: 32 op, 2490708.00 ns, 77.8346 us/op -WorkloadPilot 17: 64 op, 4916541.00 ns, 76.8210 us/op -WorkloadPilot 18: 128 op, 9704167.00 ns, 75.8138 us/op -WorkloadPilot 19: 256 op, 20003042.00 ns, 78.1369 us/op -WorkloadPilot 20: 512 op, 36367792.00 ns, 71.0308 us/op -WorkloadPilot 21: 1024 op, 77198416.00 ns, 75.3891 us/op -WorkloadPilot 22: 2048 op, 167672542.00 ns, 81.8714 us/op -WorkloadPilot 23: 4096 op, 227040125.00 ns, 55.4297 us/op -WorkloadPilot 24: 8192 op, 224780167.00 ns, 27.4390 us/op -WorkloadPilot 25: 16384 op, 397231583.00 ns, 24.2451 us/op -WorkloadPilot 26: 32768 op, 804610708.00 ns, 24.5548 us/op - -WorkloadWarmup 1: 32768 op, 831370208.00 ns, 25.3714 us/op -WorkloadWarmup 2: 32768 op, 844876958.00 ns, 25.7836 us/op -WorkloadWarmup 3: 32768 op, 822356209.00 ns, 25.0963 us/op - -// BeforeActualRun -WorkloadActual 1: 32768 op, 820540750.00 ns, 25.0409 us/op -WorkloadActual 2: 32768 op, 819454083.00 ns, 25.0078 us/op -WorkloadActual 3: 32768 op, 818789167.00 ns, 24.9875 us/op -WorkloadActual 4: 32768 op, 821731375.00 ns, 25.0773 us/op -WorkloadActual 5: 32768 op, 803282875.00 ns, 24.5142 us/op -WorkloadActual 6: 32768 op, 820004833.00 ns, 25.0246 us/op -WorkloadActual 7: 32768 op, 813126542.00 ns, 24.8147 us/op -WorkloadActual 8: 32768 op, 804031125.00 ns, 24.5371 us/op -WorkloadActual 9: 32768 op, 801119333.00 ns, 24.4482 us/op -WorkloadActual 10: 32768 op, 806195041.00 ns, 24.6031 us/op - -// AfterActualRun -WorkloadResult 1: 32768 op, 820540750.00 ns, 25.0409 us/op -WorkloadResult 2: 32768 op, 819454083.00 ns, 25.0078 us/op -WorkloadResult 3: 32768 op, 818789167.00 ns, 24.9875 us/op -WorkloadResult 4: 32768 op, 821731375.00 ns, 25.0773 us/op -WorkloadResult 5: 32768 op, 803282875.00 ns, 24.5142 us/op -WorkloadResult 6: 32768 op, 820004833.00 ns, 25.0246 us/op -WorkloadResult 7: 32768 op, 813126542.00 ns, 24.8147 us/op -WorkloadResult 8: 32768 op, 804031125.00 ns, 24.5371 us/op -WorkloadResult 9: 32768 op, 801119333.00 ns, 24.4482 us/op -WorkloadResult 10: 32768 op, 806195041.00 ns, 24.6031 us/op -// GC: 265 29 0 1671535200 32768 -// Threading: 0 0 32768 - -// AfterAll -// Benchmark Process 14429 has exited with code 0. - -Mean = 24.806 μs, StdErr = 0.080 μs (0.32%), N = 10, StdDev = 0.253 μs -Min = 24.448 μs, Q1 = 24.554 μs, Median = 24.901 μs, Q3 = 25.020 μs, Max = 25.077 μs -IQR = 0.467 μs, LowerFence = 23.853 μs, UpperFence = 25.721 μs -ConfidenceInterval = [24.423 μs; 25.188 μs] (CI 99.9%), Margin = 0.383 μs (1.54% of Mean) -Skewness = -0.25, Kurtosis = 1.07, MValue = 2 - -// ** Remained 5 (50,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_LargeJson --job "IterationCount=10, WarmupCount=3" --benchmarkId 5 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-EMWTOF(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 180000.00 ns, 180.0000 us/op -2026-01-13 21:03:05.815 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 39358875.00 ns, 39.3589 ms/op - -WorkloadPilot 1: 2 op, 227916.00 ns, 113.9580 us/op -WorkloadPilot 2: 3 op, 262583.00 ns, 87.5277 us/op -WorkloadPilot 3: 4 op, 936375.00 ns, 234.0938 us/op -WorkloadPilot 4: 5 op, 462959.00 ns, 92.5918 us/op -WorkloadPilot 5: 6 op, 532750.00 ns, 88.7917 us/op -WorkloadPilot 6: 7 op, 563000.00 ns, 80.4286 us/op -WorkloadPilot 7: 8 op, 721459.00 ns, 90.1824 us/op -WorkloadPilot 8: 9 op, 720166.00 ns, 80.0184 us/op -WorkloadPilot 9: 10 op, 777375.00 ns, 77.7375 us/op -WorkloadPilot 10: 11 op, 834125.00 ns, 75.8295 us/op -WorkloadPilot 11: 12 op, 904500.00 ns, 75.3750 us/op -WorkloadPilot 12: 13 op, 1018042.00 ns, 78.3109 us/op -WorkloadPilot 13: 14 op, 1042584.00 ns, 74.4703 us/op -WorkloadPilot 14: 15 op, 1158875.00 ns, 77.2583 us/op -WorkloadPilot 15: 16 op, 1276708.00 ns, 79.7943 us/op -WorkloadPilot 16: 32 op, 2690000.00 ns, 84.0625 us/op -WorkloadPilot 17: 64 op, 4811833.00 ns, 75.1849 us/op -WorkloadPilot 18: 128 op, 10315709.00 ns, 80.5915 us/op -WorkloadPilot 19: 256 op, 19797708.00 ns, 77.3348 us/op -WorkloadPilot 20: 512 op, 39185500.00 ns, 76.5342 us/op -WorkloadPilot 21: 1024 op, 81426917.00 ns, 79.5185 us/op -WorkloadPilot 22: 2048 op, 158136167.00 ns, 77.2149 us/op -WorkloadPilot 23: 4096 op, 220819958.00 ns, 53.9111 us/op -WorkloadPilot 24: 8192 op, 226704542.00 ns, 27.6739 us/op -WorkloadPilot 25: 16384 op, 416678667.00 ns, 25.4320 us/op -WorkloadPilot 26: 32768 op, 800683375.00 ns, 24.4349 us/op - -WorkloadWarmup 1: 32768 op, 820395875.00 ns, 25.0365 us/op -WorkloadWarmup 2: 32768 op, 830884250.00 ns, 25.3566 us/op -WorkloadWarmup 3: 32768 op, 818644125.00 ns, 24.9830 us/op - -// BeforeActualRun -WorkloadActual 1: 32768 op, 803533375.00 ns, 24.5219 us/op -WorkloadActual 2: 32768 op, 822943375.00 ns, 25.1142 us/op -WorkloadActual 3: 32768 op, 799131333.00 ns, 24.3876 us/op -WorkloadActual 4: 32768 op, 822342375.00 ns, 25.0959 us/op -WorkloadActual 5: 32768 op, 805227084.00 ns, 24.5736 us/op -WorkloadActual 6: 32768 op, 822269542.00 ns, 25.0937 us/op -WorkloadActual 7: 32768 op, 803784292.00 ns, 24.5295 us/op -WorkloadActual 8: 32768 op, 824785584.00 ns, 25.1705 us/op -WorkloadActual 9: 32768 op, 821711417.00 ns, 25.0766 us/op -WorkloadActual 10: 32768 op, 818734416.00 ns, 24.9858 us/op - -// AfterActualRun -WorkloadResult 1: 32768 op, 803533375.00 ns, 24.5219 us/op -WorkloadResult 2: 32768 op, 822943375.00 ns, 25.1142 us/op -WorkloadResult 3: 32768 op, 799131333.00 ns, 24.3876 us/op -WorkloadResult 4: 32768 op, 822342375.00 ns, 25.0959 us/op -WorkloadResult 5: 32768 op, 805227084.00 ns, 24.5736 us/op -WorkloadResult 6: 32768 op, 822269542.00 ns, 25.0937 us/op -WorkloadResult 7: 32768 op, 803784292.00 ns, 24.5295 us/op -WorkloadResult 8: 32768 op, 824785584.00 ns, 25.1705 us/op -WorkloadResult 9: 32768 op, 821711417.00 ns, 25.0766 us/op -WorkloadResult 10: 32768 op, 818734416.00 ns, 24.9858 us/op -// GC: 265 29 0 1671535488 32768 -// Threading: 0 0 32768 - -// AfterAll -// Benchmark Process 14430 has exited with code 0. - -Mean = 24.855 μs, StdErr = 0.098 μs (0.39%), N = 10, StdDev = 0.310 μs -Min = 24.388 μs, Q1 = 24.541 μs, Median = 25.031 μs, Q3 = 25.095 μs, Max = 25.170 μs -IQR = 0.555 μs, LowerFence = 23.708 μs, UpperFence = 25.928 μs -ConfidenceInterval = [24.387 μs; 25.323 μs] (CI 99.9%), Margin = 0.468 μs (1.88% of Mean) -Skewness = -0.36, Kurtosis = 1.1, MValue = 2 - -// ** Remained 4 (40,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_Base64 --job "IterationCount=10, WarmupCount=3" --benchmarkId 6 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-XWBJWR(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 217958.00 ns, 217.9580 us/op -2026-01-13 21:03:19.497 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 38024000.00 ns, 38.0240 ms/op - -WorkloadPilot 1: 2 op, 99458.00 ns, 49.7290 us/op -WorkloadPilot 2: 3 op, 25041.00 ns, 8.3470 us/op -WorkloadPilot 3: 4 op, 24209.00 ns, 6.0523 us/op -WorkloadPilot 4: 5 op, 28250.00 ns, 5.6500 us/op -WorkloadPilot 5: 6 op, 49834.00 ns, 8.3057 us/op -WorkloadPilot 6: 7 op, 38875.00 ns, 5.5536 us/op -WorkloadPilot 7: 8 op, 46792.00 ns, 5.8490 us/op -WorkloadPilot 8: 9 op, 47833.00 ns, 5.3148 us/op -WorkloadPilot 9: 10 op, 48417.00 ns, 4.8417 us/op -WorkloadPilot 10: 11 op, 53292.00 ns, 4.8447 us/op -WorkloadPilot 11: 12 op, 57500.00 ns, 4.7917 us/op -WorkloadPilot 12: 13 op, 65667.00 ns, 5.0513 us/op -WorkloadPilot 13: 14 op, 66875.00 ns, 4.7768 us/op -WorkloadPilot 14: 15 op, 69333.00 ns, 4.6222 us/op -WorkloadPilot 15: 16 op, 73333.00 ns, 4.5833 us/op -WorkloadPilot 16: 32 op, 151250.00 ns, 4.7266 us/op -WorkloadPilot 17: 64 op, 273625.00 ns, 4.2754 us/op -WorkloadPilot 18: 128 op, 537250.00 ns, 4.1973 us/op -WorkloadPilot 19: 256 op, 1153833.00 ns, 4.5072 us/op -WorkloadPilot 20: 512 op, 2224334.00 ns, 4.3444 us/op -WorkloadPilot 21: 1024 op, 4615166.00 ns, 4.5070 us/op -WorkloadPilot 22: 2048 op, 9841834.00 ns, 4.8056 us/op -WorkloadPilot 23: 4096 op, 17922625.00 ns, 4.3756 us/op -WorkloadPilot 24: 8192 op, 35693625.00 ns, 4.3571 us/op -WorkloadPilot 25: 16384 op, 70213083.00 ns, 4.2855 us/op -WorkloadPilot 26: 32768 op, 163380125.00 ns, 4.9860 us/op -WorkloadPilot 27: 65536 op, 300504209.00 ns, 4.5853 us/op -WorkloadPilot 28: 131072 op, 197663417.00 ns, 1.5081 us/op -WorkloadPilot 29: 262144 op, 391312375.00 ns, 1.4927 us/op -WorkloadPilot 30: 524288 op, 787606334.00 ns, 1.5022 us/op - -WorkloadWarmup 1: 524288 op, 782435416.00 ns, 1.4924 us/op -WorkloadWarmup 2: 524288 op, 778143875.00 ns, 1.4842 us/op -WorkloadWarmup 3: 524288 op, 784058916.00 ns, 1.4955 us/op - -// BeforeActualRun -WorkloadActual 1: 524288 op, 788792625.00 ns, 1.5045 us/op -WorkloadActual 2: 524288 op, 781723959.00 ns, 1.4910 us/op -WorkloadActual 3: 524288 op, 781277584.00 ns, 1.4902 us/op -WorkloadActual 4: 524288 op, 785909416.00 ns, 1.4990 us/op -WorkloadActual 5: 524288 op, 781774167.00 ns, 1.4911 us/op -WorkloadActual 6: 524288 op, 784133000.00 ns, 1.4956 us/op -WorkloadActual 7: 524288 op, 786714083.00 ns, 1.5005 us/op -WorkloadActual 8: 524288 op, 781269500.00 ns, 1.4902 us/op -WorkloadActual 9: 524288 op, 786479458.00 ns, 1.5001 us/op -WorkloadActual 10: 524288 op, 785444625.00 ns, 1.4981 us/op - -// AfterActualRun -WorkloadResult 1: 524288 op, 788792625.00 ns, 1.5045 us/op -WorkloadResult 2: 524288 op, 781723959.00 ns, 1.4910 us/op -WorkloadResult 3: 524288 op, 781277584.00 ns, 1.4902 us/op -WorkloadResult 4: 524288 op, 785909416.00 ns, 1.4990 us/op -WorkloadResult 5: 524288 op, 781774167.00 ns, 1.4911 us/op -WorkloadResult 6: 524288 op, 784133000.00 ns, 1.4956 us/op -WorkloadResult 7: 524288 op, 786714083.00 ns, 1.5005 us/op -WorkloadResult 8: 524288 op, 781269500.00 ns, 1.4902 us/op -WorkloadResult 9: 524288 op, 786479458.00 ns, 1.5001 us/op -WorkloadResult 10: 524288 op, 785444625.00 ns, 1.4981 us/op -// GC: 294 2 0 1845610472 524288 -// Threading: 0 0 524288 - -// AfterAll -// Benchmark Process 14434 has exited with code 0. - -Mean = 1.496 μs, StdErr = 0.002 μs (0.11%), N = 10, StdDev = 0.005 μs -Min = 1.490 μs, Q1 = 1.491 μs, Median = 1.497 μs, Q3 = 1.500 μs, Max = 1.505 μs -IQR = 0.009 μs, LowerFence = 1.478 μs, UpperFence = 1.513 μs -ConfidenceInterval = [1.488 μs; 1.504 μs] (CI 99.9%), Margin = 0.008 μs (0.52% of Mean) -Skewness = 0.11, Kurtosis = 1.34, MValue = 2 - -// ** Remained 3 (30,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_Base64 --job "IterationCount=10, WarmupCount=3" --benchmarkId 7 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-UWMYUH(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 166333.00 ns, 166.3330 us/op -2026-01-13 21:03:32.693 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 40250500.00 ns, 40.2505 ms/op - -WorkloadPilot 1: 2 op, 112000.00 ns, 56.0000 us/op -WorkloadPilot 2: 3 op, 45041.00 ns, 15.0137 us/op -WorkloadPilot 3: 4 op, 79417.00 ns, 19.8543 us/op -WorkloadPilot 4: 5 op, 48667.00 ns, 9.7334 us/op -WorkloadPilot 5: 6 op, 61042.00 ns, 10.1737 us/op -WorkloadPilot 6: 7 op, 50791.00 ns, 7.2559 us/op -WorkloadPilot 7: 8 op, 45375.00 ns, 5.6719 us/op -WorkloadPilot 8: 9 op, 47542.00 ns, 5.2824 us/op -WorkloadPilot 9: 10 op, 59750.00 ns, 5.9750 us/op -WorkloadPilot 10: 11 op, 73417.00 ns, 6.6743 us/op -WorkloadPilot 11: 12 op, 61750.00 ns, 5.1458 us/op -WorkloadPilot 12: 13 op, 64708.00 ns, 4.9775 us/op -WorkloadPilot 13: 14 op, 73667.00 ns, 5.2619 us/op -WorkloadPilot 14: 15 op, 78583.00 ns, 5.2389 us/op -WorkloadPilot 15: 16 op, 110542.00 ns, 6.9089 us/op -WorkloadPilot 16: 32 op, 198542.00 ns, 6.2044 us/op -WorkloadPilot 17: 64 op, 295792.00 ns, 4.6218 us/op -WorkloadPilot 18: 128 op, 568500.00 ns, 4.4414 us/op -WorkloadPilot 19: 256 op, 1138500.00 ns, 4.4473 us/op -WorkloadPilot 20: 512 op, 2311000.00 ns, 4.5137 us/op -WorkloadPilot 21: 1024 op, 4896791.00 ns, 4.7820 us/op -WorkloadPilot 22: 2048 op, 9847083.00 ns, 4.8081 us/op -WorkloadPilot 23: 4096 op, 18525000.00 ns, 4.5227 us/op -WorkloadPilot 24: 8192 op, 38761083.00 ns, 4.7316 us/op -WorkloadPilot 25: 16384 op, 79141917.00 ns, 4.8304 us/op -WorkloadPilot 26: 32768 op, 161911583.00 ns, 4.9411 us/op -WorkloadPilot 27: 65536 op, 292665458.00 ns, 4.4657 us/op -WorkloadPilot 28: 131072 op, 203511334.00 ns, 1.5527 us/op -WorkloadPilot 29: 262144 op, 416155208.00 ns, 1.5875 us/op -WorkloadPilot 30: 524288 op, 817333167.00 ns, 1.5589 us/op - -WorkloadWarmup 1: 524288 op, 807847209.00 ns, 1.5408 us/op -WorkloadWarmup 2: 524288 op, 818599791.00 ns, 1.5614 us/op -WorkloadWarmup 3: 524288 op, 813577083.00 ns, 1.5518 us/op - -// BeforeActualRun -WorkloadActual 1: 524288 op, 804349833.00 ns, 1.5342 us/op -WorkloadActual 2: 524288 op, 811891916.00 ns, 1.5486 us/op -WorkloadActual 3: 524288 op, 811734125.00 ns, 1.5483 us/op -WorkloadActual 4: 524288 op, 809661375.00 ns, 1.5443 us/op -WorkloadActual 5: 524288 op, 811192750.00 ns, 1.5472 us/op -WorkloadActual 6: 524288 op, 812078416.00 ns, 1.5489 us/op -WorkloadActual 7: 524288 op, 805105042.00 ns, 1.5356 us/op -WorkloadActual 8: 524288 op, 810018667.00 ns, 1.5450 us/op -WorkloadActual 9: 524288 op, 810251042.00 ns, 1.5454 us/op -WorkloadActual 10: 524288 op, 807480875.00 ns, 1.5401 us/op - -// AfterActualRun -WorkloadResult 1: 524288 op, 804349833.00 ns, 1.5342 us/op -WorkloadResult 2: 524288 op, 811891916.00 ns, 1.5486 us/op -WorkloadResult 3: 524288 op, 811734125.00 ns, 1.5483 us/op -WorkloadResult 4: 524288 op, 809661375.00 ns, 1.5443 us/op -WorkloadResult 5: 524288 op, 811192750.00 ns, 1.5472 us/op -WorkloadResult 6: 524288 op, 812078416.00 ns, 1.5489 us/op -WorkloadResult 7: 524288 op, 805105042.00 ns, 1.5356 us/op -WorkloadResult 8: 524288 op, 810018667.00 ns, 1.5450 us/op -WorkloadResult 9: 524288 op, 810251042.00 ns, 1.5454 us/op -WorkloadResult 10: 524288 op, 807480875.00 ns, 1.5401 us/op -// GC: 294 2 0 1845609464 524288 -// Threading: 0 0 524288 - -// AfterAll -// Benchmark Process 14441 has exited with code 0. - -Mean = 1.544 μs, StdErr = 0.002 μs (0.11%), N = 10, StdDev = 0.005 μs -Min = 1.534 μs, Q1 = 1.541 μs, Median = 1.545 μs, Q3 = 1.548 μs, Max = 1.549 μs -IQR = 0.007 μs, LowerFence = 1.531 μs, UpperFence = 1.558 μs -ConfidenceInterval = [1.536 μs; 1.552 μs] (CI 99.9%), Margin = 0.008 μs (0.52% of Mean) -Skewness = -0.71, Kurtosis = 1.81, MValue = 2 - -// ** Remained 2 (20,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.PermissiveMode_Xml --job "IterationCount=10, WarmupCount=3" --benchmarkId 8 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-MYUNQK(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 169458.00 ns, 169.4580 us/op -2026-01-13 21:03:46.338 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 37570750.00 ns, 37.5708 ms/op - -WorkloadPilot 1: 2 op, 78916.00 ns, 39.4580 us/op -WorkloadPilot 2: 3 op, 26875.00 ns, 8.9583 us/op -WorkloadPilot 3: 4 op, 42542.00 ns, 10.6355 us/op -WorkloadPilot 4: 5 op, 33250.00 ns, 6.6500 us/op -WorkloadPilot 5: 6 op, 34584.00 ns, 5.7640 us/op -WorkloadPilot 6: 7 op, 55583.00 ns, 7.9404 us/op -WorkloadPilot 7: 8 op, 108000.00 ns, 13.5000 us/op -WorkloadPilot 8: 9 op, 57042.00 ns, 6.3380 us/op -WorkloadPilot 9: 10 op, 118917.00 ns, 11.8917 us/op -WorkloadPilot 10: 11 op, 85667.00 ns, 7.7879 us/op -WorkloadPilot 11: 12 op, 64625.00 ns, 5.3854 us/op -WorkloadPilot 12: 13 op, 65917.00 ns, 5.0705 us/op -WorkloadPilot 13: 14 op, 70291.00 ns, 5.0208 us/op -WorkloadPilot 14: 15 op, 82000.00 ns, 5.4667 us/op -WorkloadPilot 15: 16 op, 79416.00 ns, 4.9635 us/op -WorkloadPilot 16: 32 op, 151458.00 ns, 4.7331 us/op -WorkloadPilot 17: 64 op, 295666.00 ns, 4.6198 us/op -WorkloadPilot 18: 128 op, 584083.00 ns, 4.5631 us/op -WorkloadPilot 19: 256 op, 1180750.00 ns, 4.6123 us/op -WorkloadPilot 20: 512 op, 2463625.00 ns, 4.8118 us/op -WorkloadPilot 21: 1024 op, 5088541.00 ns, 4.9693 us/op -WorkloadPilot 22: 2048 op, 10323584.00 ns, 5.0408 us/op -WorkloadPilot 23: 4096 op, 19149042.00 ns, 4.6751 us/op -WorkloadPilot 24: 8192 op, 38635208.00 ns, 4.7162 us/op -WorkloadPilot 25: 16384 op, 83278750.00 ns, 5.0829 us/op -WorkloadPilot 26: 32768 op, 188011708.00 ns, 5.7377 us/op -WorkloadPilot 27: 65536 op, 289038917.00 ns, 4.4104 us/op -WorkloadPilot 28: 131072 op, 213064542.00 ns, 1.6256 us/op -WorkloadPilot 29: 262144 op, 431157333.00 ns, 1.6447 us/op -WorkloadPilot 30: 524288 op, 846662500.00 ns, 1.6149 us/op - -WorkloadWarmup 1: 524288 op, 850038000.00 ns, 1.6213 us/op -WorkloadWarmup 2: 524288 op, 852605500.00 ns, 1.6262 us/op -WorkloadWarmup 3: 524288 op, 849160917.00 ns, 1.6196 us/op - -// BeforeActualRun -WorkloadActual 1: 524288 op, 847693250.00 ns, 1.6168 us/op -WorkloadActual 2: 524288 op, 849947833.00 ns, 1.6211 us/op -WorkloadActual 3: 524288 op, 842952875.00 ns, 1.6078 us/op -WorkloadActual 4: 524288 op, 849205667.00 ns, 1.6197 us/op -WorkloadActual 5: 524288 op, 847955083.00 ns, 1.6173 us/op -WorkloadActual 6: 524288 op, 842458084.00 ns, 1.6069 us/op -WorkloadActual 7: 524288 op, 850041542.00 ns, 1.6213 us/op -WorkloadActual 8: 524288 op, 848452542.00 ns, 1.6183 us/op -WorkloadActual 9: 524288 op, 847344417.00 ns, 1.6162 us/op -WorkloadActual 10: 524288 op, 848552458.00 ns, 1.6185 us/op - -// AfterActualRun -WorkloadResult 1: 524288 op, 847693250.00 ns, 1.6168 us/op -WorkloadResult 2: 524288 op, 849947833.00 ns, 1.6211 us/op -WorkloadResult 3: 524288 op, 842952875.00 ns, 1.6078 us/op -WorkloadResult 4: 524288 op, 849205667.00 ns, 1.6197 us/op -WorkloadResult 5: 524288 op, 847955083.00 ns, 1.6173 us/op -WorkloadResult 6: 524288 op, 842458084.00 ns, 1.6069 us/op -WorkloadResult 7: 524288 op, 850041542.00 ns, 1.6213 us/op -WorkloadResult 8: 524288 op, 848452542.00 ns, 1.6183 us/op -WorkloadResult 9: 524288 op, 847344417.00 ns, 1.6162 us/op -WorkloadResult 10: 524288 op, 848552458.00 ns, 1.6185 us/op -// GC: 292 2 0 1837221080 524288 -// Threading: 0 0 524288 - -// AfterAll -// Benchmark Process 14445 has exited with code 0. - -Mean = 1.616 μs, StdErr = 0.002 μs (0.10%), N = 10, StdDev = 0.005 μs -Min = 1.607 μs, Q1 = 1.616 μs, Median = 1.618 μs, Q3 = 1.619 μs, Max = 1.621 μs -IQR = 0.003 μs, LowerFence = 1.612 μs, UpperFence = 1.624 μs -ConfidenceInterval = [1.609 μs; 1.624 μs] (CI 99.9%), Margin = 0.008 μs (0.47% of Mean) -Skewness = -0.94, Kurtosis = 2.26, MValue = 2 - -// ** Remained 1 (10,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** -// ************************** -// Benchmark: CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -// *** Execute *** -// Launch: 1 / 1 -// Execute: dotnet 4365ab56-bc03-4101-bb91-26a93a1f7667.dll --anonymousPipes 118 119 --benchmarkName NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks.StrictMode_Xml --job "IterationCount=10, WarmupCount=3" --benchmarkId 9 in /Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0 -// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. -// BeforeAnythingElse - -// Benchmark Process Environment Information: -// BenchmarkDotNet v0.14.0 -// Runtime=.NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD -// GC=Concurrent Workstation -// HardwareIntrinsics=AdvSIMD,AES,CRC32,DP,RDM,SHA1,SHA256 VectorSize=128 -// Job: Job-MEUEWE(IterationCount=10, WarmupCount=3) - -OverheadJitting 1: 1 op, 174958.00 ns, 174.9580 us/op -2026-01-13 21:04:00.597 INFO Logging to '/Users/mauroservienti/dev/Particular/NServiceBus.Envelope.CloudEvents/src/NServiceBus.Envelope.CloudEvents.Benchmarks/bin/Release/net10.0/4365ab56-bc03-4101-bb91-26a93a1f7667/bin/Release/net10.0/' with level Info -WorkloadJitting 1: 1 op, 37754750.00 ns, 37.7548 ms/op - -WorkloadPilot 1: 2 op, 101584.00 ns, 50.7920 us/op -WorkloadPilot 2: 3 op, 49208.00 ns, 16.4027 us/op -WorkloadPilot 3: 4 op, 46291.00 ns, 11.5728 us/op -WorkloadPilot 4: 5 op, 34583.00 ns, 6.9166 us/op -WorkloadPilot 5: 6 op, 36750.00 ns, 6.1250 us/op -WorkloadPilot 6: 7 op, 40833.00 ns, 5.8333 us/op -WorkloadPilot 7: 8 op, 48292.00 ns, 6.0365 us/op -WorkloadPilot 8: 9 op, 95875.00 ns, 10.6528 us/op -WorkloadPilot 9: 10 op, 73167.00 ns, 7.3167 us/op -WorkloadPilot 10: 11 op, 68375.00 ns, 6.2159 us/op -WorkloadPilot 11: 12 op, 66250.00 ns, 5.5208 us/op -WorkloadPilot 12: 13 op, 75667.00 ns, 5.8205 us/op -WorkloadPilot 13: 14 op, 78708.00 ns, 5.6220 us/op -WorkloadPilot 14: 15 op, 81959.00 ns, 5.4639 us/op -WorkloadPilot 15: 16 op, 89083.00 ns, 5.5677 us/op -WorkloadPilot 16: 32 op, 180542.00 ns, 5.6419 us/op -WorkloadPilot 17: 64 op, 337708.00 ns, 5.2767 us/op -WorkloadPilot 18: 128 op, 657875.00 ns, 5.1396 us/op -WorkloadPilot 19: 256 op, 1275334.00 ns, 4.9818 us/op -WorkloadPilot 20: 512 op, 2588084.00 ns, 5.0549 us/op -WorkloadPilot 21: 1024 op, 5287709.00 ns, 5.1638 us/op -WorkloadPilot 22: 2048 op, 11100625.00 ns, 5.4202 us/op -WorkloadPilot 23: 4096 op, 21008125.00 ns, 5.1289 us/op -WorkloadPilot 24: 8192 op, 40818042.00 ns, 4.9827 us/op -WorkloadPilot 25: 16384 op, 86011625.00 ns, 5.2497 us/op -WorkloadPilot 26: 32768 op, 204760708.00 ns, 6.2488 us/op -WorkloadPilot 27: 65536 op, 273337000.00 ns, 4.1708 us/op -WorkloadPilot 28: 131072 op, 224696916.00 ns, 1.7143 us/op -WorkloadPilot 29: 262144 op, 440820833.00 ns, 1.6816 us/op -WorkloadPilot 30: 524288 op, 882895083.00 ns, 1.6840 us/op - -WorkloadWarmup 1: 524288 op, 878292209.00 ns, 1.6752 us/op -WorkloadWarmup 2: 524288 op, 877136583.00 ns, 1.6730 us/op -WorkloadWarmup 3: 524288 op, 887537125.00 ns, 1.6928 us/op - -// BeforeActualRun -WorkloadActual 1: 524288 op, 888085417.00 ns, 1.6939 us/op -WorkloadActual 2: 524288 op, 877407125.00 ns, 1.6735 us/op -WorkloadActual 3: 524288 op, 880285084.00 ns, 1.6790 us/op -WorkloadActual 4: 524288 op, 880823375.00 ns, 1.6800 us/op -WorkloadActual 5: 524288 op, 874400500.00 ns, 1.6678 us/op -WorkloadActual 6: 524288 op, 878560375.00 ns, 1.6757 us/op -WorkloadActual 7: 524288 op, 884286250.00 ns, 1.6866 us/op -WorkloadActual 8: 524288 op, 876493500.00 ns, 1.6718 us/op -WorkloadActual 9: 524288 op, 908325792.00 ns, 1.7325 us/op -WorkloadActual 10: 524288 op, 886055334.00 ns, 1.6900 us/op - -// AfterActualRun -WorkloadResult 1: 524288 op, 888085417.00 ns, 1.6939 us/op -WorkloadResult 2: 524288 op, 877407125.00 ns, 1.6735 us/op -WorkloadResult 3: 524288 op, 880285084.00 ns, 1.6790 us/op -WorkloadResult 4: 524288 op, 880823375.00 ns, 1.6800 us/op -WorkloadResult 5: 524288 op, 874400500.00 ns, 1.6678 us/op -WorkloadResult 6: 524288 op, 878560375.00 ns, 1.6757 us/op -WorkloadResult 7: 524288 op, 884286250.00 ns, 1.6866 us/op -WorkloadResult 8: 524288 op, 876493500.00 ns, 1.6718 us/op -WorkloadResult 9: 524288 op, 886055334.00 ns, 1.6900 us/op -// GC: 292 2 0 1837221080 524288 -// Threading: 0 0 524288 - -// AfterAll -// Benchmark Process 14449 has exited with code 0. - -Mean = 1.680 μs, StdErr = 0.003 μs (0.17%), N = 9, StdDev = 0.009 μs -Min = 1.668 μs, Q1 = 1.674 μs, Median = 1.679 μs, Q3 = 1.687 μs, Max = 1.694 μs -IQR = 0.013 μs, LowerFence = 1.654 μs, UpperFence = 1.706 μs -ConfidenceInterval = [1.665 μs; 1.695 μs] (CI 99.9%), Margin = 0.015 μs (0.88% of Mean) -Skewness = 0.26, Kurtosis = 1.49, MValue = 2 - -// ** Remained 0 (0,0%) benchmark(s) to run. Estimated finish 2026-01-13 21:04 (0h 0m from now) ** -// ***** BenchmarkRunner: Finish ***** - -// * Export * - BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report.csv - BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report-github.md - BenchmarkDotNet.Artifacts/results/NServiceBus.Envelope.CloudEvents.Benchmarks.CloudEventJsonStructuredEnvelopeHandlerBenchmarks-report.html - -// * Detailed results * -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 1.367 μs, StdErr = 0.002 μs (0.15%), N = 10, StdDev = 0.007 μs -Min = 1.355 μs, Q1 = 1.363 μs, Median = 1.369 μs, Q3 = 1.372 μs, Max = 1.374 μs -IQR = 0.008 μs, LowerFence = 1.351 μs, UpperFence = 1.384 μs -ConfidenceInterval = [1.357 μs; 1.377 μs] (CI 99.9%), Margin = 0.010 μs (0.72% of Mean) -Skewness = -0.6, Kurtosis = 1.73, MValue = 2 --------------------- Histogram -------------------- -[1.351 μs ; 1.378 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Small JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 1.414 μs, StdErr = 0.002 μs (0.15%), N = 10, StdDev = 0.007 μs -Min = 1.405 μs, Q1 = 1.409 μs, Median = 1.416 μs, Q3 = 1.420 μs, Max = 1.422 μs -IQR = 0.011 μs, LowerFence = 1.392 μs, UpperFence = 1.436 μs -ConfidenceInterval = [1.404 μs; 1.424 μs] (CI 99.9%), Margin = 0.010 μs (0.72% of Mean) -Skewness = -0.17, Kurtosis = 1.14, MValue = 2 --------------------- Histogram -------------------- -[1.401 μs ; 1.427 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 2.053 μs, StdErr = 0.002 μs (0.12%), N = 10, StdDev = 0.008 μs -Min = 2.038 μs, Q1 = 2.048 μs, Median = 2.054 μs, Q3 = 2.057 μs, Max = 2.066 μs -IQR = 0.009 μs, LowerFence = 2.035 μs, UpperFence = 2.070 μs -ConfidenceInterval = [2.041 μs; 2.065 μs] (CI 99.9%), Margin = 0.012 μs (0.57% of Mean) -Skewness = -0.18, Kurtosis = 2.21, MValue = 2 --------------------- Histogram -------------------- -[2.033 μs ; 2.071 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Medium JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 2.120 μs, StdErr = 0.003 μs (0.16%), N = 10, StdDev = 0.011 μs -Min = 2.107 μs, Q1 = 2.109 μs, Median = 2.122 μs, Q3 = 2.127 μs, Max = 2.138 μs -IQR = 0.017 μs, LowerFence = 2.083 μs, UpperFence = 2.153 μs -ConfidenceInterval = [2.104 μs; 2.136 μs] (CI 99.9%), Margin = 0.016 μs (0.76% of Mean) -Skewness = 0.05, Kurtosis = 1.48, MValue = 2 --------------------- Histogram -------------------- -[2.104 μs ; 2.144 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 24.806 μs, StdErr = 0.080 μs (0.32%), N = 10, StdDev = 0.253 μs -Min = 24.448 μs, Q1 = 24.554 μs, Median = 24.901 μs, Q3 = 25.020 μs, Max = 25.077 μs -IQR = 0.467 μs, LowerFence = 23.853 μs, UpperFence = 25.721 μs -ConfidenceInterval = [24.423 μs; 25.188 μs] (CI 99.9%), Margin = 0.383 μs (1.54% of Mean) -Skewness = -0.25, Kurtosis = 1.07, MValue = 2 --------------------- Histogram -------------------- -[24.294 μs ; 25.195 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Large JSON payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 24.855 μs, StdErr = 0.098 μs (0.39%), N = 10, StdDev = 0.310 μs -Min = 24.388 μs, Q1 = 24.541 μs, Median = 25.031 μs, Q3 = 25.095 μs, Max = 25.170 μs -IQR = 0.555 μs, LowerFence = 23.708 μs, UpperFence = 25.928 μs -ConfidenceInterval = [24.387 μs; 25.323 μs] (CI 99.9%), Margin = 0.468 μs (1.88% of Mean) -Skewness = -0.36, Kurtosis = 1.1, MValue = 2 --------------------- Histogram -------------------- -[24.199 μs ; 24.827 μs) | @@@@ -[24.827 μs ; 25.359 μs) | @@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 1.496 μs, StdErr = 0.002 μs (0.11%), N = 10, StdDev = 0.005 μs -Min = 1.490 μs, Q1 = 1.491 μs, Median = 1.497 μs, Q3 = 1.500 μs, Max = 1.505 μs -IQR = 0.009 μs, LowerFence = 1.478 μs, UpperFence = 1.513 μs -ConfidenceInterval = [1.488 μs; 1.504 μs] (CI 99.9%), Margin = 0.008 μs (0.52% of Mean) -Skewness = 0.11, Kurtosis = 1.34, MValue = 2 --------------------- Histogram -------------------- -[1.487 μs ; 1.508 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - Base64 binary payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 1.544 μs, StdErr = 0.002 μs (0.11%), N = 10, StdDev = 0.005 μs -Min = 1.534 μs, Q1 = 1.541 μs, Median = 1.545 μs, Q3 = 1.548 μs, Max = 1.549 μs -IQR = 0.007 μs, LowerFence = 1.531 μs, UpperFence = 1.558 μs -ConfidenceInterval = [1.536 μs; 1.552 μs] (CI 99.9%), Margin = 0.008 μs (0.52% of Mean) -Skewness = -0.71, Kurtosis = 1.81, MValue = 2 --------------------- Histogram -------------------- -[1.531 μs ; 1.552 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 1.616 μs, StdErr = 0.002 μs (0.10%), N = 10, StdDev = 0.005 μs -Min = 1.607 μs, Q1 = 1.616 μs, Median = 1.618 μs, Q3 = 1.619 μs, Max = 1.621 μs -IQR = 0.003 μs, LowerFence = 1.612 μs, UpperFence = 1.624 μs -ConfidenceInterval = [1.609 μs; 1.624 μs] (CI 99.9%), Margin = 0.008 μs (0.47% of Mean) -Skewness = -0.94, Kurtosis = 2.26, MValue = 2 --------------------- Histogram -------------------- -[1.604 μs ; 1.624 μs) | @@@@@@@@@@ ---------------------------------------------------- - -CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': Job-VESCTB(IterationCount=10, WarmupCount=3) -Runtime = .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD; GC = Concurrent Workstation -Mean = 1.680 μs, StdErr = 0.003 μs (0.17%), N = 9, StdDev = 0.009 μs -Min = 1.668 μs, Q1 = 1.674 μs, Median = 1.679 μs, Q3 = 1.687 μs, Max = 1.694 μs -IQR = 0.013 μs, LowerFence = 1.654 μs, UpperFence = 1.706 μs -ConfidenceInterval = [1.665 μs; 1.695 μs] (CI 99.9%), Margin = 0.015 μs (0.88% of Mean) -Skewness = 0.26, Kurtosis = 1.49, MValue = 2 --------------------- Histogram -------------------- -[1.662 μs ; 1.699 μs) | @@@@@@@@@ ---------------------------------------------------- - -// * Summary * - -BenchmarkDotNet v0.14.0, macOS 26.2 (25C56) [Darwin 25.2.0] -Apple M1 Ultra, 1 CPU, 20 logical and 20 physical cores -.NET SDK 10.0.101 - [Host] : .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD - Job-VESCTB : .NET 10.0.1 (10.0.125.57005), Arm64 RyuJIT AdvSIMD - -IterationCount=10 WarmupCount=3 - -| Method | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Gen1 | Allocated | Alloc Ratio | -|------------------------------------------ |----------:|----------:|----------:|------:|--------:|-------:|-------:|----------:|------------:| -| 'Permissive mode - Small JSON payload' | 1.367 μs | 0.0099 μs | 0.0065 μs | 0.81 | 0.01 | 0.5283 | 0.0019 | 3.24 KB | 0.95 | -| 'Strict mode - Small JSON payload' | 1.414 μs | 0.0102 μs | 0.0067 μs | 0.84 | 0.01 | 0.5283 | 0.0019 | 3.24 KB | 0.95 | -| 'Permissive mode - Medium JSON payload' | 2.053 μs | 0.0117 μs | 0.0078 μs | 1.22 | 0.01 | 0.6676 | 0.0038 | 4.09 KB | 1.20 | -| 'Strict mode - Medium JSON payload' | 2.120 μs | 0.0162 μs | 0.0107 μs | 1.26 | 0.01 | 0.6676 | 0.0038 | 4.09 KB | 1.20 | -| 'Permissive mode - Large JSON payload' | 24.806 μs | 0.3828 μs | 0.2532 μs | 14.77 | 0.16 | 8.0872 | 0.8850 | 49.82 KB | 14.56 | -| 'Strict mode - Large JSON payload' | 24.855 μs | 0.4680 μs | 0.3096 μs | 14.80 | 0.19 | 8.0872 | 0.8850 | 49.82 KB | 14.56 | -| 'Permissive mode - Base64 binary payload' | 1.496 μs | 0.0078 μs | 0.0052 μs | 0.89 | 0.01 | 0.5608 | 0.0038 | 3.44 KB | 1.00 | -| 'Strict mode - Base64 binary payload' | 1.544 μs | 0.0081 μs | 0.0054 μs | 0.92 | 0.01 | 0.5608 | 0.0038 | 3.44 KB | 1.00 | -| 'Permissive mode - XML payload' | 1.616 μs | 0.0077 μs | 0.0051 μs | 0.96 | 0.01 | 0.5569 | 0.0038 | 3.42 KB | 1.00 | -| 'Strict mode - XML payload' | 1.680 μs | 0.0147 μs | 0.0088 μs | 1.00 | 0.01 | 0.5569 | 0.0038 | 3.42 KB | 1.00 | - -// * Hints * -Outliers - CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Permissive mode - XML payload': IterationCount=10, WarmupCount=3 -> 2 outliers were detected (1.61 μs, 1.61 μs) - CloudEventJsonStructuredEnvelopeHandlerBenchmarks.'Strict mode - XML payload': IterationCount=10, WarmupCount=3 -> 1 outlier was removed (1.73 μs) - -// * Legends * - Mean : Arithmetic mean of all measurements - Error : Half of 99.9% confidence interval - StdDev : Standard deviation of all measurements - Ratio : Mean of the ratio distribution ([Current]/[Baseline]) - RatioSD : Standard deviation of the ratio distribution ([Current]/[Baseline]) - Gen0 : GC Generation 0 collects per 1000 operations - Gen1 : GC Generation 1 collects per 1000 operations - Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B) - Alloc Ratio : Allocated memory ratio distribution ([Current]/[Baseline]) - 1 μs : 1 Microsecond (0.000001 sec) - -// * Diagnostic Output - MemoryDiagnoser * - - -// ***** BenchmarkRunner: End ***** -Run time: 00:02:06 (126.97 sec), executed benchmarks: 10 - -Global total time: 00:02:16 (136.08 sec), executed benchmarks: 10 -// * Artifacts cleanup * -Artifacts cleanup is finished diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/CloudEventJsonStructuredEnvelopeHandlerBenchmarks.cs b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/CloudEventJsonStructuredEnvelopeHandlerBenchmarks.cs deleted file mode 100644 index 01307d8..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/CloudEventJsonStructuredEnvelopeHandlerBenchmarks.cs +++ /dev/null @@ -1,299 +0,0 @@ -namespace NServiceBus.Envelope.CloudEvents.Benchmarks; - -using System.Buffers; -using System.Text; -using System.Text.Json; -using BenchmarkDotNet.Attributes; -using Extensibility; - -[MemoryDiagnoser] -[SimpleJob(warmupCount: 3, iterationCount: 10)] -public class CloudEventJsonStructuredEnvelopeHandlerBenchmarks -{ - CloudEventJsonStructuredEnvelopeHandler? _permissiveHandler; - CloudEventJsonStructuredEnvelopeHandler? _strictHandler; - Dictionary? _headers; - byte[]? _smallJsonPayload; - byte[]? _mediumJsonPayload; - byte[]? _largeJsonPayload; - byte[]? _base64Payload; - byte[]? _xmlPayload; - string? _nativeMessageId; - - class MyEvent; - - [GlobalSetup] - public void Setup() - { - _nativeMessageId = Guid.NewGuid().ToString(); - - _headers = new Dictionary - { - [Headers.ContentType] = "application/cloudevents+json; charset=utf8" - }; - - // Configure permissive handler - var permissiveConfig = new CloudEventsConfiguration - { - TypeMappings = - { - { "com.example.someevent", [typeof(MyEvent)] }, - } - }; - permissiveConfig.EnvelopeUnwrappers.Find() - .EnvelopeHandlingMode = JsonStructureEnvelopeHandlingMode.Permissive; - - _permissiveHandler = new CloudEventJsonStructuredEnvelopeHandler( - new CloudEventsMetrics(new FakeMeterFactory(), "benchmark"), - permissiveConfig); - - // Configure strict handler - var strictConfig = new CloudEventsConfiguration - { - TypeMappings = - { - { "com.example.someevent", [typeof(MyEvent)] }, - } - }; - strictConfig.EnvelopeUnwrappers.Find() - .EnvelopeHandlingMode = JsonStructureEnvelopeHandlingMode.Strict; - - _strictHandler = new CloudEventJsonStructuredEnvelopeHandler( - new CloudEventsMetrics(new FakeMeterFactory(), "benchmark"), - strictConfig); - - // Create small JSON payload (typical small message) - _smallJsonPayload = CreateJsonPayload(new Dictionary - { - ["property"] = "value" - }); - - // Create medium JSON payload (typical business message) - _mediumJsonPayload = CreateJsonPayload(new Dictionary - { - ["orderId"] = "12345", - ["customerId"] = "67890", - ["orderDate"] = "2024-01-13T10:00:00Z", - ["items"] = new[] - { - new { productId = "P1", quantity = 2, price = 29.99 }, - new { productId = "P2", quantity = 1, price = 49.99 }, - new { productId = "P3", quantity = 3, price = 9.99 } - }, - ["totalAmount"] = 139.94, - ["shippingAddress"] = new - { - street = "123 Main St", - city = "Springfield", - state = "IL", - zipCode = "62701", - country = "USA" - } - }); - - // Create large JSON payload (large complex message) - var largeData = new Dictionary - { - ["metadata"] = new - { - version = "1.0", - timestamp = DateTime.UtcNow, - correlationId = Guid.NewGuid().ToString() - } - }; - - var items = new List(); - for (int i = 0; i < 100; i++) - { - items.Add(new - { - id = i, - name = $"Item {i}", - description = $"This is a detailed description for item {i}", - properties = new Dictionary - { - ["prop1"] = "value1", - ["prop2"] = "value2", - ["prop3"] = "value3" - } - }); - } - largeData["items"] = items; - _largeJsonPayload = CreateJsonPayload(largeData); - - // Create base64 binary payload - var binaryData = Encoding.UTF8.GetBytes("Some XML or binary content here"); - _base64Payload = CreateBase64Payload(binaryData); - - // Create XML payload - _xmlPayload = CreateXmlPayload("12345John Doe"); - } - - byte[] CreateJsonPayload(object data) - { - var cloudEvent = new Dictionary - { - ["TYPE"] = "com.example.someevent", - ["SOURCE"] = "/mycontext", - ["ID"] = Guid.NewGuid().ToString(), - ["DATA"] = data, - ["DATACONTENTTYPE"] = "application/json", - ["TIME"] = "2024-01-13T10:00:00Z", - ["SPECVERSION"] = "1.0" - }; - - return Encoding.UTF8.GetBytes(JsonSerializer.Serialize(cloudEvent)); - } - - byte[] CreateBase64Payload(byte[] binaryData) - { - var cloudEvent = new Dictionary - { - ["TYPE"] = "com.example.someevent", - ["SOURCE"] = "/mycontext", - ["ID"] = Guid.NewGuid().ToString(), - ["DATA_BASE64"] = Convert.ToBase64String(binaryData), - ["DATACONTENTTYPE"] = "application/xml", - ["TIME"] = "2024-01-13T10:00:00Z", - ["SPECVERSION"] = "1.0" - }; - - return Encoding.UTF8.GetBytes(JsonSerializer.Serialize(cloudEvent)); - } - - byte[] CreateXmlPayload(string xmlData) - { - var cloudEvent = new Dictionary - { - ["TYPE"] = "com.example.someevent", - ["SOURCE"] = "/mycontext", - ["ID"] = Guid.NewGuid().ToString(), - ["DATA"] = xmlData, - ["DATACONTENTTYPE"] = "application/xml", - ["TIME"] = "2024-01-13T10:00:00Z", - ["SPECVERSION"] = "1.0" - }; - - return Encoding.UTF8.GetBytes(JsonSerializer.Serialize(cloudEvent)); - } - - [Benchmark(Description = "Permissive mode - Small JSON payload")] - public Dictionary? PermissiveMode_SmallJson() - { - var bodyWriter = new ArrayBufferWriter(); - return _permissiveHandler!.UnwrapEnvelope( - _nativeMessageId!, - _headers!, - _smallJsonPayload.AsSpan(), - new ContextBag(), - bodyWriter); - } - - [Benchmark(Description = "Strict mode - Small JSON payload")] - public Dictionary? StrictMode_SmallJson() - { - var bodyWriter = new ArrayBufferWriter(); - return _strictHandler!.UnwrapEnvelope( - _nativeMessageId!, - _headers!, - _smallJsonPayload.AsSpan(), - new ContextBag(), - bodyWriter); - } - - [Benchmark(Description = "Permissive mode - Medium JSON payload")] - public Dictionary? PermissiveMode_MediumJson() - { - var bodyWriter = new ArrayBufferWriter(); - return _permissiveHandler!.UnwrapEnvelope( - _nativeMessageId!, - _headers!, - _mediumJsonPayload.AsSpan(), - new ContextBag(), - bodyWriter); - } - - [Benchmark(Description = "Strict mode - Medium JSON payload")] - public Dictionary? StrictMode_MediumJson() - { - var bodyWriter = new ArrayBufferWriter(); - return _strictHandler!.UnwrapEnvelope( - _nativeMessageId!, - _headers!, - _mediumJsonPayload.AsSpan(), - new ContextBag(), - bodyWriter); - } - - [Benchmark(Description = "Permissive mode - Large JSON payload")] - public Dictionary? PermissiveMode_LargeJson() - { - var bodyWriter = new ArrayBufferWriter(); - return _permissiveHandler!.UnwrapEnvelope( - _nativeMessageId!, - _headers!, - _largeJsonPayload.AsSpan(), - new ContextBag(), - bodyWriter); - } - - [Benchmark(Description = "Strict mode - Large JSON payload")] - public Dictionary? StrictMode_LargeJson() - { - var bodyWriter = new ArrayBufferWriter(); - return _strictHandler!.UnwrapEnvelope( - _nativeMessageId!, - _headers!, - _largeJsonPayload.AsSpan(), - new ContextBag(), - bodyWriter); - } - - [Benchmark(Description = "Permissive mode - Base64 binary payload")] - public Dictionary? PermissiveMode_Base64() - { - var bodyWriter = new ArrayBufferWriter(); - return _permissiveHandler!.UnwrapEnvelope( - _nativeMessageId!, - _headers!, - _base64Payload.AsSpan(), - new ContextBag(), - bodyWriter); - } - - [Benchmark(Description = "Strict mode - Base64 binary payload")] - public Dictionary? StrictMode_Base64() - { - var bodyWriter = new ArrayBufferWriter(); - return _strictHandler!.UnwrapEnvelope( - _nativeMessageId!, - _headers!, - _base64Payload.AsSpan(), - new ContextBag(), - bodyWriter); - } - - [Benchmark(Description = "Permissive mode - XML payload")] - public Dictionary? PermissiveMode_Xml() - { - var bodyWriter = new ArrayBufferWriter(); - return _permissiveHandler!.UnwrapEnvelope( - _nativeMessageId!, - _headers!, - _xmlPayload.AsSpan(), - new ContextBag(), - bodyWriter); - } - - [Benchmark(Description = "Strict mode - XML payload", Baseline = true)] - public Dictionary? StrictMode_Xml() - { - var bodyWriter = new ArrayBufferWriter(); - return _strictHandler!.UnwrapEnvelope( - _nativeMessageId!, - _headers!, - _xmlPayload.AsSpan(), - new ContextBag(), - bodyWriter); - } -} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/FakeMeterFactory.cs b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/FakeMeterFactory.cs deleted file mode 100644 index 92df7e2..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/FakeMeterFactory.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace NServiceBus.Envelope.CloudEvents.Benchmarks; - -using System.Diagnostics.Metrics; - -class FakeMeterFactory : IMeterFactory -{ - readonly List _meters = []; - - public void Dispose() - { - foreach (var meter in _meters) - { - meter.Dispose(); - } - } - - public Meter Create(MeterOptions options) - { - var meter = new Meter(options); - _meters.Add(meter); - return meter; - } -} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/NServiceBus.Envelope.CloudEvents.Benchmarks.csproj b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/NServiceBus.Envelope.CloudEvents.Benchmarks.csproj deleted file mode 100644 index 3ef821f..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/NServiceBus.Envelope.CloudEvents.Benchmarks.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - Exe - net10.0 - enable - enable - - - - - - - - - - - \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/Program.cs b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/Program.cs deleted file mode 100644 index 437ed9e..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/Program.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace NServiceBus.Envelope.CloudEvents.Benchmarks; - -using BenchmarkDotNet.Running; - -static class Program -{ - public static void Main(string[] args) - { - BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args); - } -} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/README.md b/src/NServiceBus.Envelope.CloudEvents.Benchmarks/README.md deleted file mode 100644 index 4e06eb2..0000000 --- a/src/NServiceBus.Envelope.CloudEvents.Benchmarks/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# NServiceBus.Envelope.CloudEvents Benchmarks - -This project contains performance benchmarks for the CloudEvents envelope unwrapper, specifically for JSON Structured CloudEvents. - -## Running the Benchmarks - -To run all benchmarks: - -```bash -cd src/NServiceBus.Envelope.CloudEvents.Benchmarks -dotnet run -c Release -``` - -To run specific benchmarks: - -```bash -dotnet run -c Release --filter "*SmallJson*" -``` - -To list all available benchmarks: - -```bash -dotnet run -c Release --list flat -``` - -## Benchmark Scenarios - -The benchmarks test the `CloudEventJsonStructuredEnvelopeHandler` with various scenarios: - -### Handler Modes -- **Permissive Mode**: More lenient CloudEvents validation -- **Strict Mode**: Strict CloudEvents validation with Content-Type checking - -### Payload Types -- **Small JSON**: Simple JSON object with a single property -- **Medium JSON**: Typical business message with order details -- **Large JSON**: Complex message with 100 items and nested properties -- **Base64 Binary**: Binary data encoded as base64 -- **XML**: XML payload in the data field - -## Benchmark Configuration - -- **MemoryDiagnoser**: Enabled to track memory allocations -- **Warmup Count**: 3 iterations -- **Iteration Count**: 10 iterations per benchmark -- **Baseline**: `StrictMode_Xml` is set as the baseline for comparison - -## Results - -Results are stored in `BenchmarkDotNet.Artifacts` directory after running the benchmarks. Look for: -- `results/` - Contains markdown, HTML, and CSV formatted results -- Detailed performance metrics including: - - Mean execution time - - Standard deviation - - Memory allocations (Gen0, Gen1, Gen2, and total allocated) - - Comparison ratios to baseline - -## Understanding the Results - -The benchmarks help identify: -- Performance differences between Strict and Permissive modes -- Impact of payload size on processing time -- Memory allocation patterns -- Efficiency of the buffer writer API \ No newline at end of file From 76d46d32a944c6b562762a35dc252917bdf9a01c Mon Sep 17 00:00:00 2001 From: Adam Furmanek Date: Mon, 19 Jan 2026 17:48:31 +0100 Subject: [PATCH 13/21] Bringing back other implementations --- ...loudEventAmqpBinaryEnvelopeHandlerTests.cs | 257 ++++++++++++++++++ ...loudEventHttpBinaryEnvelopeHandlerTests.cs | 257 ++++++++++++++++++ .../CloudEventAmqpBinaryEnvelopeHandler.cs | 170 ++++++++++++ .../CloudEventAmqpBinaryEnvelopeUnwrapper.cs | 15 + .../CloudEventHttpBinaryEnvelopeHandler.cs | 172 ++++++++++++ .../CloudEventHttpBinaryEnvelopeUnwrapper.cs | 15 + .../EnvelopeUnwrappers.cs | 2 + 7 files changed, 888 insertions(+) create mode 100644 src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs create mode 100644 src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs create mode 100644 src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs create mode 100644 src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs create mode 100644 src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs create mode 100644 src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs new file mode 100644 index 0000000..dcdaeab --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs @@ -0,0 +1,257 @@ +namespace NServiceBus.Envelope.CloudEvents.Tests; + +using System; +using System.Buffers; +using System.Collections.Generic; +using Microsoft.Extensions.Diagnostics.Metrics.Testing; +using System.Text; +using System.Text.Json; +using Extensibility; +using Fakes; +using NServiceBus; +using NUnit.Framework; + +[TestFixture] +class CloudEventAmqpBinaryEnvelopeHandlerTests +{ + internal required TestMeterFactory MeterFactory; + internal required string TestEndpointName; + internal required string NativeMessageId; + internal required Dictionary NativeHeaders; + internal required CloudEventsConfiguration cloudEventsConfiguration; + internal required CloudEventAmqpBinaryEnvelopeHandler EnvelopeHandler; + internal required MetricCollector InvalidMessageCounter; + internal required MetricCollector UnexpectedVersionCounter; + internal required MetricCollector AttemptCounter; + internal required ReadOnlyMemory Body; + + class MyEvent + { + } + + [SetUp] + public void SetUp() + { + NativeMessageId = Guid.NewGuid().ToString(); + cloudEventsConfiguration = new CloudEventsConfiguration + { + TypeMappings = + { + { "com.example.someevent", [typeof(MyEvent)]} + } + }; + NativeHeaders = new Dictionary + { + ["cloudEvents:type"] = "com.example.someevent", + ["cloudEvents:source"] = "/mycontext", + ["cloudEvents:id"] = NativeMessageId, + ["cloudEvents:time"] = "2023-10-10T10:00:00Z", + ["cloudEvents:specversion"] = "1.0" + }; + Body = new ReadOnlyMemory(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(new Dictionary + { + ["some_other_property"] = "some_other_value", + ["data"] = "{}", + }))); + TestEndpointName = "testEndpointName"; + MeterFactory = new(); + + AttemptCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", + "nservicebus.envelope.cloud_events.received.unwrapping_attempt"); + + InvalidMessageCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", + "nservicebus.envelope.cloud_events.received.invalid_message"); + + UnexpectedVersionCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", + "nservicebus.envelope.cloud_events.received.unexpected_version"); + + EnvelopeHandler = new CloudEventAmqpBinaryEnvelopeHandler(new(MeterFactory, TestEndpointName), cloudEventsConfiguration); + } + + [Test] + public void Should_unmarshal_regular_message() + { + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + Assert.Multiple(() => + { + AssertTypicalFields(actual); + Assert.That(actual.Body.Span.SequenceEqual(Body.Span)); + }); + } + + [Test] + public void Should_ignore_missing_time() + { + NativeHeaders.Remove("time"); + + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + AssertTypicalFields(actual, shouldHaveTime: false); + } + + [Test] + public void Should_ignore_empty_time() + { + NativeHeaders["time"] = ""; + + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + AssertTypicalFields(actual, shouldHaveTime: false); + } + + [Test] + public void Should_ignore_null_time() + { + NativeHeaders["time"] = null; + + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + AssertTypicalFields(actual, shouldHaveTime: false); + } + + [Test] + public void Should_ignore_string_null_time() + { + NativeHeaders["time"] = "null"; + + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + AssertTypicalFields(actual, shouldHaveTime: false); + } + + [Test] + public void Should_report_metric_when_unmarshaling_regular_message() + { + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + var invalidMessageCounterSnapshot = InvalidMessageCounter.GetMeasurementSnapshot(); + + Assert.Multiple(() => + { + Assert.That(invalidMessageCounterSnapshot.Count, Is.EqualTo(1)); + Assert.That(invalidMessageCounterSnapshot[0].Value, Is.EqualTo(0)); + Assert.That(invalidMessageCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); + Assert.That(invalidMessageCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], + Is.EqualTo(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY)); + }); + } + + [Test] + public void Should_report_metric_when_unmarshaling_message_with_version() + { + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); + + Assert.Multiple(() => + { + Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); + Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(0)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], + Is.EqualTo(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], + Is.EqualTo("1.0")); + }); + } + + [Test] + public void Should_report_metric_when_unmarshaling_message_without_version() + { + NativeHeaders.Remove("cloudEvents:specversion"); + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); + + Assert.Multiple(() => + { + Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); + Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(1)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], + Is.EqualTo(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], + Is.EqualTo(null)); + }); + } + + [Test] + public void Should_report_metric_when_unmarshaling_message_with_unrecognized_version() + { + NativeHeaders["cloudEvents:specversion"] = "wrong"; + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); + + Assert.Multiple(() => + { + Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); + Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(1)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], + Is.EqualTo(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], + Is.EqualTo("wrong")); + }); + } + + [Test] + [TestCase("cloudEvents:type")] + [TestCase("cloudEvents:id")] + [TestCase("cloudEvents:source")] + public void Should_return_null_when_property_is_missing(string property) + { + NativeHeaders.Remove(property); + + (Dictionary Headers, ReadOnlyMemory Body)? actual = RunEnvelopHandlerTest(); + + Assert.That(actual, Is.Null); + } + + [Test] + [TestCase("cloudEvents:type")] + [TestCase("cloudEvents:id")] + [TestCase("cloudEvents:source")] + public void Should_not_record_metric_when_property_is_missing(string property) + { + NativeHeaders.Remove(property); + RunEnvelopHandlerTest(); + + var invalidMessageCounterSnapshot = InvalidMessageCounter.GetMeasurementSnapshot(); + + Assert.That(invalidMessageCounterSnapshot.Count, Is.EqualTo(0)); + } + + (Dictionary headers, ReadOnlyMemory body)? RunEnvelopHandlerTest() + { + var bodyWriter = new ArrayBufferWriter(); + var upperCaseHeaders = NativeHeaders.ToDictionary(k => k.Key.ToUpper(), k => k.Value); + var headers = EnvelopeHandler.UnwrapEnvelope(NativeMessageId, upperCaseHeaders!, Body.Span, new ContextBag(), bodyWriter); + return headers == null ? null : (headers, bodyWriter.WrittenMemory); + } + + void AssertTypicalFields((Dictionary Headers, ReadOnlyMemory Body) actual, bool shouldHaveTime = true) + { + var attemptCounterSnapshot = AttemptCounter.GetMeasurementSnapshot(); + Assert.Multiple(() => + { + Assert.That(actual.Headers[Headers.MessageId], Is.EqualTo(NativeMessageId)); + Assert.That(actual.Headers[Headers.ReplyToAddress], Is.EqualTo(NativeHeaders["cloudEvents:source"])); + if (shouldHaveTime) + { + Assert.That(actual.Headers[Headers.TimeSent], Is.EqualTo("2023-10-10 10:00:00:000000 Z")); + } + + Assert.That(actual.Headers.ContainsKey("data"), Is.False); + Assert.That(actual.Headers.ContainsKey("some_other_property"), Is.False); + Assert.That(actual.Headers[Headers.EnclosedMessageTypes], Is.EqualTo("NServiceBus.Envelope.CloudEvents.Tests.CloudEventAmqpBinaryEnvelopeHandlerTests+MyEvent")); + + Assert.That(attemptCounterSnapshot.Count, Is.EqualTo(1)); + Assert.That(attemptCounterSnapshot[0].Value, Is.EqualTo(1)); + Assert.That(attemptCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); + Assert.That(attemptCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], + Is.EqualTo(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY)); + }); + } +} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs new file mode 100644 index 0000000..e993873 --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs @@ -0,0 +1,257 @@ +namespace NServiceBus.Envelope.CloudEvents.Tests; + +using System; +using System.Buffers; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; +using Extensibility; +using Fakes; +using Microsoft.Extensions.Diagnostics.Metrics.Testing; +using NServiceBus; +using NUnit.Framework; + +[TestFixture] +class CloudEventHttpBinaryEnvelopeHandlerTests +{ + internal required TestMeterFactory MeterFactory; + internal required string TestEndpointName; + internal required string NativeMessageId; + internal required Dictionary NativeHeaders; + internal required ReadOnlyMemory Body; + internal required CloudEventHttpBinaryEnvelopeHandler EnvelopeHandler; + internal required MetricCollector InvalidMessageCounter; + internal required MetricCollector UnexpectedVersionCounter; + internal required MetricCollector AttemptCounter; + internal required CloudEventsConfiguration cloudEventsConfiguration; + + class MyEvent + { + } + + [SetUp] + public void SetUp() + { + NativeMessageId = Guid.NewGuid().ToString(); + NativeHeaders = new Dictionary + { + ["ce-type"] = "com.example.someevent", + ["ce-source"] = "/mycontext", + ["ce-id"] = NativeMessageId, + ["ce-time"] = "2023-10-10T10:00:00Z", + ["ce-specversion"] = "1.0" + }; + cloudEventsConfiguration = new CloudEventsConfiguration + { + TypeMappings = + { + { "com.example.someevent", [typeof(MyEvent)] } + } + }; + Body = new ReadOnlyMemory(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(new Dictionary + { + ["some_other_property"] = "some_other_value", + ["data"] = "{}", + }))); + TestEndpointName = "testEndpointName"; + MeterFactory = new(); + + AttemptCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", + "nservicebus.envelope.cloud_events.received.unwrapping_attempt"); + + InvalidMessageCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", + "nservicebus.envelope.cloud_events.received.invalid_message"); + + UnexpectedVersionCounter = new MetricCollector(MeterFactory, "NServiceBus.Envelope.CloudEvents", + "nservicebus.envelope.cloud_events.received.unexpected_version"); + + EnvelopeHandler = new CloudEventHttpBinaryEnvelopeHandler(new(MeterFactory, TestEndpointName), cloudEventsConfiguration); + } + + [Test] + public void Should_unmarshal_regular_message() + { + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + Assert.Multiple(() => + { + AssertTypicalFields(actual); + Assert.That(actual.Body.Span.SequenceEqual(Body.Span)); + }); + } + + [Test] + public void Should_ignore_missing_time() + { + NativeHeaders.Remove("time"); + + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + AssertTypicalFields(actual, shouldHaveTime: false); + } + + [Test] + public void Should_ignore_empty_time() + { + NativeHeaders["time"] = ""; + + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + AssertTypicalFields(actual, shouldHaveTime: false); + } + + [Test] + public void Should_ignore_null_time() + { + NativeHeaders["time"] = null; + + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + AssertTypicalFields(actual, shouldHaveTime: false); + } + + [Test] + public void Should_ignore_string_null_time() + { + NativeHeaders["time"] = "null"; + + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + AssertTypicalFields(actual, shouldHaveTime: false); + } + + [Test] + public void Should_report_metric_when_unmarshaling_regular_message() + { + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + var invalidMessageCounterSnapshot = InvalidMessageCounter.GetMeasurementSnapshot(); + + Assert.Multiple(() => + { + Assert.That(invalidMessageCounterSnapshot.Count, Is.EqualTo(1)); + Assert.That(invalidMessageCounterSnapshot[0].Value, Is.EqualTo(0)); + Assert.That(invalidMessageCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); + Assert.That(invalidMessageCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], + Is.EqualTo(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY)); + }); + } + + [Test] + public void Should_report_metric_when_unmarshaling_message_with_version() + { + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); + + Assert.Multiple(() => + { + Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); + Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(0)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], + Is.EqualTo(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], + Is.EqualTo("1.0")); + }); + } + + [Test] + public void Should_report_metric_when_unmarshaling_message_without_version() + { + NativeHeaders.Remove("ce-specversion"); + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); + + Assert.Multiple(() => + { + Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); + Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(1)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], + Is.EqualTo(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], + Is.EqualTo(null)); + }); + } + + [Test] + public void Should_report_metric_when_unmarshaling_message_with_unrecognized_version() + { + NativeHeaders["ce-specversion"] = "wrong"; + (Dictionary Headers, ReadOnlyMemory Body) actual = RunEnvelopHandlerTest()!.Value; + + var unexpectedVersionCounterSnapshot = UnexpectedVersionCounter.GetMeasurementSnapshot(); + + Assert.Multiple(() => + { + Assert.That(unexpectedVersionCounterSnapshot.Count, Is.EqualTo(1)); + Assert.That(unexpectedVersionCounterSnapshot[0].Value, Is.EqualTo(1)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], + Is.EqualTo(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY)); + Assert.That(unexpectedVersionCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.version"], + Is.EqualTo("wrong")); + }); + } + + [Test] + [TestCase("ce-type")] + [TestCase("ce-id")] + [TestCase("ce-source")] + public void Should_return_null_when_property_is_missing(string property) + { + NativeHeaders.Remove(property); + + (Dictionary Headers, ReadOnlyMemory Body)? actual = RunEnvelopHandlerTest(); + + Assert.That(actual, Is.Null); + } + + [Test] + [TestCase("ce-type")] + [TestCase("ce-id")] + [TestCase("ce-source")] + public void Should_not_record_metric_when_property_is_missing(string property) + { + NativeHeaders.Remove(property); + RunEnvelopHandlerTest(); + + var invalidMessageCounterSnapshot = InvalidMessageCounter.GetMeasurementSnapshot(); + + Assert.That(invalidMessageCounterSnapshot.Count, Is.EqualTo(0)); + } + + (Dictionary headers, ReadOnlyMemory body)? RunEnvelopHandlerTest() + { + var bodyWriter = new ArrayBufferWriter(); + var upperCaseHeaders = NativeHeaders.ToDictionary(k => k.Key.ToUpper(), k => k.Value); + var headers = EnvelopeHandler.UnwrapEnvelope(NativeMessageId, upperCaseHeaders!, Body.Span, new ContextBag(), bodyWriter); + return headers == null ? null : (headers, bodyWriter.WrittenMemory); + } + + void AssertTypicalFields((Dictionary Headers, ReadOnlyMemory Body) actual, bool shouldHaveTime = true) + { + var attemptCounterSnapshot = AttemptCounter.GetMeasurementSnapshot(); + Assert.Multiple(() => + { + Assert.That(actual.Headers[Headers.MessageId], Is.EqualTo(NativeMessageId)); + Assert.That(actual.Headers[Headers.ReplyToAddress], Is.EqualTo(NativeHeaders["ce-source"])); + if (shouldHaveTime) + { + Assert.That(actual.Headers[Headers.TimeSent], Is.EqualTo("2023-10-10 10:00:00:000000 Z")); + } + + Assert.That(actual.Headers.ContainsKey("data"), Is.False); + Assert.That(actual.Headers.ContainsKey("some_other_property"), Is.False); + Assert.That(actual.Headers[Headers.EnclosedMessageTypes], Is.EqualTo("NServiceBus.Envelope.CloudEvents.Tests.CloudEventHttpBinaryEnvelopeHandlerTests+MyEvent")); + + Assert.That(attemptCounterSnapshot.Count, Is.EqualTo(1)); + Assert.That(attemptCounterSnapshot[0].Value, Is.EqualTo(1)); + Assert.That(attemptCounterSnapshot[0].Tags["nservicebus.endpoint"], Is.EqualTo(TestEndpointName)); + Assert.That(attemptCounterSnapshot[0].Tags["nservicebus.envelope.cloud_events.received.envelope_type"], + Is.EqualTo(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY)); + }); + } +} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs new file mode 100644 index 0000000..5fe5883 --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs @@ -0,0 +1,170 @@ +namespace NServiceBus.Envelope.CloudEvents; + +using System; +using System.Buffers; +using System.Collections.Generic; +using System.Linq; +using Extensibility; +using Logging; + +class CloudEventAmqpBinaryConstants +{ + internal const string HeaderPrefix = "cloudEvents:"; + internal const string TypeProperty = HeaderPrefix + "type"; + internal const string IdProperty = HeaderPrefix + "id"; + internal const string SourceProperty = HeaderPrefix + "source"; + internal const string TimeProperty = HeaderPrefix + "time"; + internal const string VersionProperty = HeaderPrefix + "specversion"; + internal const string SupportedVersion = "1.0"; + internal const string NullLiteral = "null"; + + internal static readonly string[] RequiredHeaders = [IdProperty, SourceProperty, TypeProperty]; +} + +class CloudEventAmqpBinaryEnvelopeHandler(CloudEventsMetrics metrics, CloudEventsConfiguration config) : IEnvelopeHandler +{ + static readonly ILog Log = LogManager.GetLogger(); + + public Dictionary? UnwrapEnvelope(string nativeMessageId, IDictionary incomingHeaders, + ReadOnlySpan incomingBody, ContextBag extensions, IBufferWriter bodyWriter) + { + metrics.RecordAttemptingToUnwrap(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY); + var caseInsensitiveHeaders = ToCaseInsensitiveDictionary(incomingHeaders); + if (!IsValidMessage(nativeMessageId, caseInsensitiveHeaders)) + { + return null; + } + + bodyWriter.Write(incomingBody); + return ExtractHeaders(nativeMessageId, caseInsensitiveHeaders); + } + + static Dictionary ToCaseInsensitiveDictionary(IDictionary incomingHeaders) => + incomingHeaders + .ToDictionary(p => p.Key, p => p.Value, + StringComparer.OrdinalIgnoreCase); + + Dictionary ExtractHeaders(string nativeMessageId, IDictionary existingHeaders) + { + var headersCopy = existingHeaders.ToDictionary(k => k.Key, k => k.Value); + + headersCopy[Headers.MessageId] = ExtractId(existingHeaders); + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.MessageId], CloudEventJsonStructuredConstants.IdProperty, nativeMessageId); + } + + headersCopy[Headers.ReplyToAddress] = ExtractSource(existingHeaders); + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.ReplyToAddress], CloudEventJsonStructuredConstants.SourceProperty, nativeMessageId); + } + + headersCopy[Headers.EnclosedMessageTypes] = ExtractType(existingHeaders); + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.EnclosedMessageTypes], CloudEventJsonStructuredConstants.TypeProperty, nativeMessageId); + } + + if (existingHeaders.TryGetValue(CloudEventAmqpBinaryConstants.TimeProperty, out var time) + && !string.IsNullOrEmpty(time) && time != CloudEventAmqpBinaryConstants.NullLiteral) + { + /* + * If what comes in is something similar to "2018-04-05T17:31:00Z", compliant with the CloudEvents spec + * and ISO 8601, NServiceBus will not be happy and later in the pipeline there will be a parsing exception + */ + headersCopy[Headers.TimeSent] = DateTimeOffsetHelper.ToWireFormattedString(DateTimeOffset.Parse(time)); + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.TimeSent], CloudEventJsonStructuredConstants.TimeProperty, nativeMessageId); + } + } + else + { + if (Log.IsDebugEnabled) + { + Log.DebugFormat("No time extracted for messageId {0}", nativeMessageId); + } + } + + return headersCopy; + } + + static string ExtractId(IDictionary existingHeaders) => ExtractHeader(existingHeaders, CloudEventAmqpBinaryConstants.IdProperty); + + string ExtractType(IDictionary existingHeaders) + { + var cloudEventType = ExtractHeader(existingHeaders, CloudEventAmqpBinaryConstants.TypeProperty); + return config.TypeMappings.TryGetValue(cloudEventType, out var typeMapping) + ? string.Join(',', typeMapping) + : cloudEventType; + } + + static string ExtractSource(IDictionary existingHeaders) => ExtractHeader(existingHeaders, CloudEventAmqpBinaryConstants.SourceProperty); + + static string ExtractHeader(IDictionary existingHeaders, string property) => existingHeaders[property]; + + bool IsValidMessage(string nativeMessageId, IDictionary headers) + { + if (!HasRequiredHeaders(nativeMessageId, headers)) + { + return false; + } + + metrics.RecordValidMessage(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY); + + if (headers.TryGetValue(CloudEventAmqpBinaryConstants.VersionProperty, out var version)) + { + if (version != CloudEventAmqpBinaryConstants.SupportedVersion) + { + if (Log.IsWarnEnabled) + { + Log.WarnFormat("Unexpected CloudEvent version property value {0} for message {1}", version, nativeMessageId); + } + metrics.RecordUnexpectedVersion(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY, version); + } + else + { + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Correct version field for message {0}", nativeMessageId); + } + metrics.RecordExpectedVersion(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY, + CloudEventAmqpBinaryConstants.SupportedVersion); + } + } + else + { + if (Log.IsWarnEnabled) + { + Log.WarnFormat("CloudEvent version property is missing for message id {0}", nativeMessageId); + } + metrics.RecordUnexpectedVersion(CloudEventsMetrics.CloudEventTypes.AMQP_BINARY, null); + } + + return true; + } + + static bool HasRequiredHeaders(string nativeMessageId, IDictionary incomingHeaders) + { + foreach (var header in CloudEventAmqpBinaryConstants.RequiredHeaders) + { + if (!incomingHeaders.ContainsKey(header)) + { + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Message {0} has no property {1}", nativeMessageId, header); + } + + return false; + } + } + + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Message {0} has all required properties", nativeMessageId); + } + + return true; + } +} diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs new file mode 100644 index 0000000..e94fa8c --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs @@ -0,0 +1,15 @@ +namespace NServiceBus.Envelope.CloudEvents; + +using Features; + +/// +/// Unwrapper for AMQP Binary cloud events envelopes. +/// +public class CloudEventAmqpBinaryEnvelopeUnwrapper() : EnvelopeUnwrapper +{ + internal override void RegisterUnwrapper(FeatureConfigurationContext context, Action unwrapperDiagnosticWriter) + { + RegisterUnwrapper(context); + unwrapperDiagnosticWriter(new { EnvelopeHandler = typeof(CloudEventAmqpBinaryEnvelopeHandler) }); + } +} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs new file mode 100644 index 0000000..7124cd2 --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs @@ -0,0 +1,172 @@ +namespace NServiceBus.Envelope.CloudEvents; + +using System; +using System.Buffers; +using System.Collections.Generic; +using System.Linq; +using Extensibility; +using Logging; + +class CloudEventHttpBinaryConstants +{ + internal const string HeaderPrefix = "ce-"; + internal const string TypeProperty = HeaderPrefix + "type"; + internal const string IdProperty = HeaderPrefix + "id"; + internal const string SourceProperty = HeaderPrefix + "source"; + internal const string TimeProperty = HeaderPrefix + "time"; + internal const string VersionProperty = HeaderPrefix + "specversion"; + internal const string SupportedVersion = "1.0"; + internal const string NullLiteral = "null"; + + internal static readonly string[] RequiredHeaders = [IdProperty, SourceProperty, TypeProperty]; +} + +class CloudEventHttpBinaryEnvelopeHandler(CloudEventsMetrics metrics, CloudEventsConfiguration config) : IEnvelopeHandler +{ + static readonly ILog Log = LogManager.GetLogger(); + + public Dictionary? UnwrapEnvelope(string nativeMessageId, IDictionary incomingHeaders, + ReadOnlySpan incomingBody, ContextBag extensions, IBufferWriter bodyWriter) + { + metrics.RecordAttemptingToUnwrap(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY); + var caseInsensitiveHeaders = ToCaseInsensitiveDictionary(incomingHeaders); + if (!IsValidMessage(nativeMessageId, caseInsensitiveHeaders)) + { + return null; + } + + bodyWriter.Write(incomingBody); + return ExtractHeaders(nativeMessageId, caseInsensitiveHeaders); + } + + static Dictionary ToCaseInsensitiveDictionary(IDictionary incomingHeaders) => + incomingHeaders + .ToDictionary(p => p.Key, p => p.Value, + StringComparer.OrdinalIgnoreCase); + + Dictionary ExtractHeaders(string nativeMessageId, IDictionary existingHeaders) + { + var headersCopy = existingHeaders.ToDictionary(k => k.Key, k => k.Value); + + headersCopy[Headers.MessageId] = ExtractId(existingHeaders); + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.MessageId], CloudEventJsonStructuredConstants.IdProperty, nativeMessageId); + } + + headersCopy[Headers.ReplyToAddress] = ExtractSource(existingHeaders); + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.ReplyToAddress], CloudEventJsonStructuredConstants.SourceProperty, nativeMessageId); + } + + headersCopy[Headers.EnclosedMessageTypes] = ExtractType(existingHeaders); + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.EnclosedMessageTypes], CloudEventJsonStructuredConstants.TypeProperty, nativeMessageId); + } + + if (existingHeaders.TryGetValue(CloudEventHttpBinaryConstants.TimeProperty, out var time) && !string.IsNullOrEmpty(time) && time != CloudEventHttpBinaryConstants.NullLiteral) + { + /* + * If what comes in is something similar to "2018-04-05T17:31:00Z", compliant with the CloudEvents spec + * and ISO 8601, NServiceBus will not be happy and later in the pipeline there will be a parsing exception + */ + headersCopy[Headers.TimeSent] = DateTimeOffsetHelper.ToWireFormattedString(DateTimeOffset.Parse(time)); + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Extracted {0} for {1} field for messageId {2}", headersCopy[Headers.TimeSent], CloudEventJsonStructuredConstants.TimeProperty, nativeMessageId); + } + } + else + { + if (Log.IsDebugEnabled) + { + Log.DebugFormat("No time extracted for messageId {0}", nativeMessageId); + } + } + + return headersCopy; + } + + string ExtractType(IDictionary existingHeaders) + { + var cloudEventType = ExtractHeader(existingHeaders, CloudEventHttpBinaryConstants.TypeProperty); + return config.TypeMappings.TryGetValue(cloudEventType, out var typeMapping) + ? string.Join(',', typeMapping) + : cloudEventType; + } + + static string ExtractId(IDictionary existingHeaders) => + ExtractHeader(existingHeaders, CloudEventHttpBinaryConstants.IdProperty); + + static string ExtractSource(IDictionary existingHeaders) => + ExtractHeader(existingHeaders, CloudEventHttpBinaryConstants.SourceProperty); + + static string ExtractHeader(IDictionary existingHeaders, string property) => + existingHeaders[property]; + + bool IsValidMessage(string nativeMessageId, IDictionary headers) + { + if (!HasRequiredHeaders(nativeMessageId, headers)) + { + return false; + } + + metrics.RecordValidMessage(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY); + + if (headers.TryGetValue(CloudEventHttpBinaryConstants.VersionProperty, out var version)) + { + if (version != CloudEventHttpBinaryConstants.SupportedVersion) + { + if (Log.IsWarnEnabled) + { + Log.WarnFormat("Unexpected CloudEvent version property value {0} for message {1}", version, nativeMessageId); + } + metrics.RecordUnexpectedVersion(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY, version); + } + else + { + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Correct version field for message {0}", nativeMessageId); + } + metrics.RecordExpectedVersion(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY, + CloudEventHttpBinaryConstants.SupportedVersion); + } + } + else + { + if (Log.IsWarnEnabled) + { + Log.WarnFormat("CloudEvent version property is missing for message id {0}", nativeMessageId); + } + metrics.RecordUnexpectedVersion(CloudEventsMetrics.CloudEventTypes.HTTP_BINARY, null); + } + + return true; + } + + static bool HasRequiredHeaders(string nativeMessageId, IDictionary incomingHeaders) + { + foreach (var header in CloudEventHttpBinaryConstants.RequiredHeaders) + { + if (!incomingHeaders.ContainsKey(header)) + { + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Message {0} has no property {1}", nativeMessageId, header); + } + + return false; + } + } + + if (Log.IsDebugEnabled) + { + Log.DebugFormat("Message {0} has all required properties", nativeMessageId); + } + + return true; + } +} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs new file mode 100644 index 0000000..40f7adc --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs @@ -0,0 +1,15 @@ +namespace NServiceBus.Envelope.CloudEvents; + +using Features; + +/// +/// Unwrapper for HTTP Binary cloud events envelopes. +/// +public class CloudEventHttpBinaryEnvelopeUnwrapper() : EnvelopeUnwrapper +{ + internal override void RegisterUnwrapper(FeatureConfigurationContext context, Action unwrapperDiagnosticWriter) + { + RegisterUnwrapper(context); + unwrapperDiagnosticWriter(new { EnvelopeHandler = typeof(CloudEventHttpBinaryEnvelopeHandler) }); + } +} \ No newline at end of file diff --git a/src/NServiceBus.Envelope.CloudEvents/EnvelopeUnwrappers.cs b/src/NServiceBus.Envelope.CloudEvents/EnvelopeUnwrappers.cs index 4f057a4..895d397 100644 --- a/src/NServiceBus.Envelope.CloudEvents/EnvelopeUnwrappers.cs +++ b/src/NServiceBus.Envelope.CloudEvents/EnvelopeUnwrappers.cs @@ -10,6 +10,8 @@ public class EnvelopeUnwrappers : IEnumerable OrderedDictionary Unwrappers { get; } = new() { { typeof(CloudEventJsonStructuredEnvelopeUnwrapper), new CloudEventJsonStructuredEnvelopeUnwrapper() }, + { typeof(CloudEventHttpBinaryEnvelopeUnwrapper), new CloudEventHttpBinaryEnvelopeUnwrapper() }, + { typeof(CloudEventAmqpBinaryEnvelopeUnwrapper), new CloudEventAmqpBinaryEnvelopeUnwrapper() } }; /// From d525d1cfa9cc14a0292ca02bdc39ce6dc7170be2 Mon Sep 17 00:00:00 2001 From: Adam Furmanek Date: Tue, 20 Jan 2026 08:13:59 +0100 Subject: [PATCH 14/21] Bringing back acceptance tests --- .../When_amqp_binary_message_received.cs | 120 ++++++++++++++++++ .../When_http_binary_message_received.cs | 120 ++++++++++++++++++ 2 files changed, 240 insertions(+) create mode 100644 src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs create mode 100644 src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs new file mode 100644 index 0000000..0888c6f --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs @@ -0,0 +1,120 @@ +namespace NServiceBus.Envelope.CloudEvents.AcceptanceTests.CloudEvents; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AcceptanceTesting; +using Configuration.AdvancedExtensibility; +using NServiceBus.AcceptanceTests; +using NServiceBus.AcceptanceTests.EndpointTemplates; +using Pipeline; +using Transport; +using NUnit.Framework; + +public class When_amqp_binary_message_received : NServiceBusAcceptanceTest +{ + [Test] + public async Task An_amqp_binary_cloud_event_is_received() + { + var context = await Scenario.Define() + .WithEndpoint(g => g.When(b => + { + // The following represents a CloudEvent that Azure Blob Storage generates + // to notify that a new blob item has been created. + // Azure sends CloudEvents as JSON Structured. Below is the equivalent + // in the AMQP Binary format. + // The headers are set in the CustomSerializationBehavior. + return b.SendLocal(new Message() + { + Api = "PutBlockList", + ClientRequestId = "4c5dd7fb-2c48-4a27-bb30-5361b5de920a", + RequestId = "9aeb0fdf-c01e-0131-0922-9eb549000000", + ETag = "0x8D76C39E4407333", + ContentType = "image/png", + ContentLength = 30699, + BlobType = "BlockBlob", + Url = "https://gridtesting.blob.core.windows.net/testcontainer/{new-file}", + Sequencer = "000000000000000000000000000099240000000000c41c18" + }); + })) + .Done(c => c.MessageReceived) + .Run().ConfigureAwait(false); + + using (Assert.EnterMultipleScope()) + { + Assert.That(string.IsNullOrWhiteSpace(context.MessageId), Is.False); + Assert.That(context.Headers[Headers.MessageId], Is.EqualTo(context.MessageId), "Should populate the NServiceBus.MessageId header with the new value"); + } + } + + class CustomSerializationBehavior : IBehavior + { + // The custom serializer is required to ensure the outgoing message contains + // only the specific CloudEvents required headers and not the NServiceBus ones. + public Task Invoke(IDispatchContext context, Func next) + { + OutgoingMessage outgoingMessage = context.Operations.First().Message; + + Dictionary headers = outgoingMessage.Headers; + headers.Clear(); + headers[Headers.ContentType] = "application/json; charset=utf-8"; + headers["cloudEvents:specversion"] = "1.0"; + headers["cloudEvents:type"] = "Microsoft.Storage.BlobCreated"; + headers["cloudEvents:source"] = "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}"; + headers["cloudEvents:id"] = "9aeb0fdf-c01e-0131-0922-9eb54906e209"; + headers["cloudEvents:time"] = "2019-11-18T15:13:39.4589254Z"; + headers["subject"] = "blobServices/default/containers/{storage-container}/blobs/{new-file}"; + + return next(context); + } + } + + class Context : ScenarioContext + { + public bool MessageReceived { get; set; } + public string MessageId { get; set; } + public Dictionary Headers { get; set; } + } + + class Endpoint : EndpointConfigurationBuilder + { + public Endpoint() + { + EndpointSetup(c => + { + var config = c.GetSettings().Get(CloudEventsEndpointConfigurationExtensions.CloudEventsSetting); + config.TypeMappings.Add("Microsoft.Storage.BlobCreated", [typeof(Message)]); + + c.Pipeline.Register("CustomSerializationBehavior", new CustomSerializationBehavior(), + "Serializing message"); + }); + } + + class Handler(Context testContext) : IHandleMessages + { + public Task Handle(Message message, IMessageHandlerContext context) + { + testContext.MessageId = context.MessageId; + testContext.Headers = context.MessageHeaders.ToDictionary(x => x.Key, x => x.Value); + testContext.MessageReceived = true; + + return Task.CompletedTask; + } + } + } + + + public class Message : IMessage + { + public string Api { get; set; } + public string ClientRequestId { get; set; } + public string RequestId { get; set; } + public string ETag { get; set; } + public string ContentType { get; set; } + public int ContentLength { get; set; } + public string BlobType { get; set; } + public string Url { get; set; } + public string Sequencer { get; set; } + } +} diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs new file mode 100644 index 0000000..cdad636 --- /dev/null +++ b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs @@ -0,0 +1,120 @@ +namespace NServiceBus.Envelope.CloudEvents.AcceptanceTests.CloudEvents; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AcceptanceTesting; +using Configuration.AdvancedExtensibility; +using NServiceBus.AcceptanceTests; +using NServiceBus.AcceptanceTests.EndpointTemplates; +using Pipeline; +using Transport; +using NUnit.Framework; + +public class When_http_binary_message_received : NServiceBusAcceptanceTest +{ + [Test] + public async Task An_http_binary_cloud_event_is_received() + { + var context = await Scenario.Define() + .WithEndpoint(g => g.When(b => + { + // The following represents a CloudEvent that Azure Blob Storage generates + // to notify that a new blob item has been created. + // Azure sends CloudEvents as JSON Structured. Below is the equivalent + // in the HTTP Binary format. + // The headers are set in the CustomSerializationBehavior. + return b.SendLocal(new Message() + { + Api = "PutBlockList", + ClientRequestId = "4c5dd7fb-2c48-4a27-bb30-5361b5de920a", + RequestId = "9aeb0fdf-c01e-0131-0922-9eb549000000", + ETag = "0x8D76C39E4407333", + ContentType = "image/png", + ContentLength = 30699, + BlobType = "BlockBlob", + Url = "https://gridtesting.blob.core.windows.net/testcontainer/{new-file}", + Sequencer = "000000000000000000000000000099240000000000c41c18" + }); + })) + .Done(c => c.MessageReceived) + .Run().ConfigureAwait(false); + + using (Assert.EnterMultipleScope()) + { + Assert.That(string.IsNullOrWhiteSpace(context.MessageId), Is.False); + Assert.That(context.Headers[Headers.MessageId], Is.EqualTo(context.MessageId), "Should populate the NServiceBus.MessageId header with the new value"); + } + } + + class CustomSerializationBehavior : IBehavior + { + // The custom serializer is required to ensure the outgoing message contains + // only the specific CloudEvents required headers and not the NServiceBus ones. + public Task Invoke(IDispatchContext context, Func next) + { + OutgoingMessage outgoingMessage = context.Operations.First().Message; + + Dictionary headers = outgoingMessage.Headers; + headers.Clear(); + headers[Headers.ContentType] = "application/json; charset=utf-8"; + headers["ce-specversion"] = "1.0"; + headers["ce-type"] = "Microsoft.Storage.BlobCreated"; + headers["ce-source"] = "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Storage/storageAccounts/{storage-account}"; + headers["ce-id"] = "9aeb0fdf-c01e-0131-0922-9eb54906e209"; + headers["ce-time"] = "2019-11-18T15:13:39.4589254Z"; + headers["subject"] = "blobServices/default/containers/{storage-container}/blobs/{new-file}"; + + return next(context); + } + } + + class Context : ScenarioContext + { + public bool MessageReceived { get; set; } + public string MessageId { get; set; } + public Dictionary Headers { get; set; } + } + + class Endpoint : EndpointConfigurationBuilder + { + public Endpoint() + { + EndpointSetup(c => + { + var config = c.GetSettings().Get(CloudEventsEndpointConfigurationExtensions.CloudEventsSetting); + config.TypeMappings.Add("Microsoft.Storage.BlobCreated", [typeof(Message)]); + + c.Pipeline.Register("CustomSerializationBehavior", new CustomSerializationBehavior(), + "Serializing message"); + }); + } + + class Handler(Context testContext) : IHandleMessages + { + public Task Handle(Message message, IMessageHandlerContext context) + { + testContext.MessageId = context.MessageId; + testContext.Headers = context.MessageHeaders.ToDictionary(x => x.Key, x => x.Value); + testContext.MessageReceived = true; + + return Task.CompletedTask; + } + } + } + + + public class Message : IMessage + { + public string Api { get; set; } + public string ClientRequestId { get; set; } + public string RequestId { get; set; } + public string ETag { get; set; } + public string ContentType { get; set; } + public int ContentLength { get; set; } + public string BlobType { get; set; } + public string Url { get; set; } + public string Sequencer { get; set; } + } +} From 69e762ce8339e6a0e4c6651c732c0c1295531d76 Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Wed, 21 Jan 2026 09:23:32 +0100 Subject: [PATCH 15/21] Update src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj --- .../NServiceBus.Envelope.CloudEvents.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj index 2e026c9..d1eeddf 100644 --- a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj +++ b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj @@ -32,9 +32,6 @@ <_Parameter1>NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests - - <_Parameter1>NServiceBus.Envelope.CloudEvents.Benchmarks - From 95fa565eb42de9a1998f772d042501095116673f Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Wed, 21 Jan 2026 09:41:07 +0100 Subject: [PATCH 16/21] Cleanup using directives --- ...onfigureEndpointAzureServiceBusTransport.cs | 6 +----- .../TestIndependenceSkipBehavior.cs | 4 ++-- .../When_amqp_binary_message_received.cs | 16 ++++++---------- .../When_http_binary_message_received.cs | 16 ++++++---------- .../When_json_structured_message_received.cs | 18 +++++++----------- ...cceptanceTestingTransportWithCloudEvents.cs | 6 +----- .../Cleanup.cs | 4 ---- .../ClientFactories.cs | 1 - .../ConfigureEndpointSqsTransport.cs | 1 - .../SetupFixture.cs | 2 -- .../TestNameHelper.cs | 2 -- .../When_receiving_http_binary.cs | 3 +-- ...CloudEventAmqpBinaryEnvelopeHandlerTests.cs | 5 +---- ...CloudEventHttpBinaryEnvelopeHandlerTests.cs | 3 --- .../Fakes/TestMeterFactory.cs | 1 - ...dEventJsonStructuredEnvelopeHandlerTests.cs | 3 --- ...dEventJsonStructuredEnvelopeHandlerTests.cs | 3 --- .../CloudEventAmqpBinaryEnvelopeHandler.cs | 3 --- .../CloudEventHttpBinaryEnvelopeHandler.cs | 3 --- .../CloudEventsFeature.cs | 1 - .../CloudEventsMetrics.cs | 1 - 21 files changed, 25 insertions(+), 77 deletions(-) diff --git a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/ConfigureEndpointAzureServiceBusTransport.cs b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/ConfigureEndpointAzureServiceBusTransport.cs index 5bd0ff5..7f8a329 100644 --- a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/ConfigureEndpointAzureServiceBusTransport.cs +++ b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/ConfigureEndpointAzureServiceBusTransport.cs @@ -1,8 +1,4 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using NServiceBus; +using Microsoft.Extensions.DependencyInjection; using NServiceBus.AcceptanceTesting.Customization; using NServiceBus.AcceptanceTesting.Support; using NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests; diff --git a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/TestIndependenceSkipBehavior.cs b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/TestIndependenceSkipBehavior.cs index 075b51f..73543a4 100644 --- a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/TestIndependenceSkipBehavior.cs +++ b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/TestIndependenceSkipBehavior.cs @@ -1,8 +1,8 @@ namespace NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests; -using NServiceBus.AcceptanceTesting; -using NServiceBus.Pipeline; +using AcceptanceTesting; using NUnit.Framework; +using Pipeline; class TestIndependenceSkipBehavior : IBehavior { diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs index 0888c6f..ed9e3ac 100644 --- a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs +++ b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_amqp_binary_message_received.cs @@ -1,16 +1,12 @@ -namespace NServiceBus.Envelope.CloudEvents.AcceptanceTests.CloudEvents; +namespace NServiceBus.AcceptanceTests.CloudEvents; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using AcceptanceTesting; using Configuration.AdvancedExtensibility; -using NServiceBus.AcceptanceTests; -using NServiceBus.AcceptanceTests.EndpointTemplates; -using Pipeline; -using Transport; +using EndpointTemplates; +using Envelope.CloudEvents; +using NServiceBus.Pipeline; using NUnit.Framework; +using Transport; public class When_amqp_binary_message_received : NServiceBusAcceptanceTest { @@ -25,7 +21,7 @@ public async Task An_amqp_binary_cloud_event_is_received() // Azure sends CloudEvents as JSON Structured. Below is the equivalent // in the AMQP Binary format. // The headers are set in the CustomSerializationBehavior. - return b.SendLocal(new Message() + return b.SendLocal(new Message { Api = "PutBlockList", ClientRequestId = "4c5dd7fb-2c48-4a27-bb30-5361b5de920a", diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs index cdad636..53af526 100644 --- a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs +++ b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_http_binary_message_received.cs @@ -1,16 +1,12 @@ -namespace NServiceBus.Envelope.CloudEvents.AcceptanceTests.CloudEvents; +namespace NServiceBus.AcceptanceTests.CloudEvents; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using AcceptanceTesting; using Configuration.AdvancedExtensibility; -using NServiceBus.AcceptanceTests; -using NServiceBus.AcceptanceTests.EndpointTemplates; -using Pipeline; -using Transport; +using EndpointTemplates; +using Envelope.CloudEvents; +using NServiceBus.Pipeline; using NUnit.Framework; +using Transport; public class When_http_binary_message_received : NServiceBusAcceptanceTest { @@ -25,7 +21,7 @@ public async Task An_http_binary_cloud_event_is_received() // Azure sends CloudEvents as JSON Structured. Below is the equivalent // in the HTTP Binary format. // The headers are set in the CustomSerializationBehavior. - return b.SendLocal(new Message() + return b.SendLocal(new Message { Api = "PutBlockList", ClientRequestId = "4c5dd7fb-2c48-4a27-bb30-5361b5de920a", diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_json_structured_message_received.cs b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_json_structured_message_received.cs index de8f6a0..b13a75c 100644 --- a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_json_structured_message_received.cs +++ b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/CloudEvents/When_json_structured_message_received.cs @@ -1,16 +1,12 @@ -namespace NServiceBus.Envelope.CloudEvents.AcceptanceTests.CloudEvents; +namespace NServiceBus.AcceptanceTests.CloudEvents; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using AcceptanceTesting; using Configuration.AdvancedExtensibility; -using NServiceBus.AcceptanceTests; -using NServiceBus.AcceptanceTests.EndpointTemplates; -using Pipeline; -using Transport; +using EndpointTemplates; +using Envelope.CloudEvents; +using NServiceBus.Pipeline; using NUnit.Framework; +using Transport; public class When_json_structured_message_received : NServiceBusAcceptanceTest { @@ -23,7 +19,7 @@ public async Task A_json_structured_cloud_event_is_received() // The following represents a CloudEvent that Azure Blob Storage generates // to notify that a new blob item has been created. // The headers are set in the CustomSerializationBehavior. - return b.SendLocal(new Message() + return b.SendLocal(new Message { SpecVersion = "1.0", Type = "Microsoft.Storage.BlobCreated", @@ -32,7 +28,7 @@ public async Task A_json_structured_cloud_event_is_received() Id = "9aeb0fdf-c01e-0131-0922-9eb54906e209", Time = "2019-11-18T15:13:39.4589254Z", Subject = "blobServices/default/containers/{storage-container}/blobs/{new-file}", - Data = new NestedData() + Data = new NestedData { Api = "PutBlockList", ClientRequestId = "4c5dd7fb-2c48-4a27-bb30-5361b5de920a", diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/ConfigureEndpointAcceptanceTestingTransportWithCloudEvents.cs b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/ConfigureEndpointAcceptanceTestingTransportWithCloudEvents.cs index aed0993..42da7e7 100644 --- a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/ConfigureEndpointAcceptanceTestingTransportWithCloudEvents.cs +++ b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/ConfigureEndpointAcceptanceTestingTransportWithCloudEvents.cs @@ -1,11 +1,7 @@ namespace NServiceBus.AcceptanceTests; -using System; -using System.IO; -using System.Threading.Tasks; using AcceptanceTesting.Customization; -using NServiceBus; -using NServiceBus.AcceptanceTesting.Support; +using AcceptanceTesting.Support; using NUnit.Framework; public class ConfigureEndpointAcceptanceTestingTransportWithCloudEvents( diff --git a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/Cleanup.cs b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/Cleanup.cs index 5c561a4..595f5d0 100644 --- a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/Cleanup.cs +++ b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/Cleanup.cs @@ -1,9 +1,5 @@ namespace NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Amazon.S3; using Amazon.S3.Model; using Amazon.S3.Util; diff --git a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/ClientFactories.cs b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/ClientFactories.cs index 5c4d476..0d5cc16 100644 --- a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/ClientFactories.cs +++ b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/ClientFactories.cs @@ -2,7 +2,6 @@ namespace NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests; -using System; using Amazon.Runtime; using Amazon.S3; using Amazon.SimpleNotificationService; diff --git a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/ConfigureEndpointSqsTransport.cs b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/ConfigureEndpointSqsTransport.cs index c34aaf9..df9bedc 100644 --- a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/ConfigureEndpointSqsTransport.cs +++ b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/ConfigureEndpointSqsTransport.cs @@ -1,6 +1,5 @@ namespace NServiceBus.AcceptanceTests; -using System.Threading.Tasks; using AcceptanceTesting.Customization; using AcceptanceTesting.Support; using Envelope.CloudEvents.SQS.AcceptanceTests; diff --git a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/SetupFixture.cs b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/SetupFixture.cs index 1eb2243..f244e85 100644 --- a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/SetupFixture.cs +++ b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/SetupFixture.cs @@ -1,8 +1,6 @@ namespace NServiceBus.AcceptanceTests; -using System; using System.Text.RegularExpressions; -using System.Threading.Tasks; using Envelope.CloudEvents.SQS.AcceptanceTests; using NUnit.Framework; diff --git a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/TestNameHelper.cs b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/TestNameHelper.cs index 62329a2..3a9825b 100644 --- a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/TestNameHelper.cs +++ b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/TestNameHelper.cs @@ -1,7 +1,5 @@ namespace NServiceBus.AcceptanceTests; -using System; -using System.Linq; using System.Text; static class TestNameHelper diff --git a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/When_receiving_http_binary.cs b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/When_receiving_http_binary.cs index b460c5d..74a1f91 100644 --- a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/When_receiving_http_binary.cs +++ b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/When_receiving_http_binary.cs @@ -1,10 +1,9 @@ namespace NServiceBus.AcceptanceTests; using System.Text.Json; -using System.Threading.Tasks; -using Amazon.SQS.Model; using AcceptanceTesting; using AcceptanceTesting.Customization; +using Amazon.SQS.Model; using Configuration.AdvancedExtensibility; using EndpointTemplates; using Envelope.CloudEvents; diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs index dcdaeab..425c3e8 100644 --- a/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs +++ b/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventAmqpBinaryEnvelopeHandlerTests.cs @@ -1,14 +1,11 @@ namespace NServiceBus.Envelope.CloudEvents.Tests; -using System; using System.Buffers; -using System.Collections.Generic; -using Microsoft.Extensions.Diagnostics.Metrics.Testing; using System.Text; using System.Text.Json; using Extensibility; using Fakes; -using NServiceBus; +using Microsoft.Extensions.Diagnostics.Metrics.Testing; using NUnit.Framework; [TestFixture] diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs index e993873..033a506 100644 --- a/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs +++ b/src/NServiceBus.Envelope.CloudEvents.Tests/CloudEventHttpBinaryEnvelopeHandlerTests.cs @@ -1,14 +1,11 @@ namespace NServiceBus.Envelope.CloudEvents.Tests; -using System; using System.Buffers; -using System.Collections.Generic; using System.Text; using System.Text.Json; using Extensibility; using Fakes; using Microsoft.Extensions.Diagnostics.Metrics.Testing; -using NServiceBus; using NUnit.Framework; [TestFixture] diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/Fakes/TestMeterFactory.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/Fakes/TestMeterFactory.cs index 949bf39..02cc0d1 100644 --- a/src/NServiceBus.Envelope.CloudEvents.Tests/Fakes/TestMeterFactory.cs +++ b/src/NServiceBus.Envelope.CloudEvents.Tests/Fakes/TestMeterFactory.cs @@ -1,6 +1,5 @@ namespace NServiceBus.Envelope.CloudEvents.Tests.Fakes; -using System.Collections.Generic; using System.Diagnostics.Metrics; class TestMeterFactory : IMeterFactory diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/PermissiveCloudEventJsonStructuredEnvelopeHandlerTests.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/PermissiveCloudEventJsonStructuredEnvelopeHandlerTests.cs index 7eef2f4..f59739b 100644 --- a/src/NServiceBus.Envelope.CloudEvents.Tests/PermissiveCloudEventJsonStructuredEnvelopeHandlerTests.cs +++ b/src/NServiceBus.Envelope.CloudEvents.Tests/PermissiveCloudEventJsonStructuredEnvelopeHandlerTests.cs @@ -1,14 +1,11 @@ namespace NServiceBus.Envelope.CloudEvents.Tests; -using System; using System.Buffers; -using System.Collections.Generic; using System.Text; using System.Text.Json; using Extensibility; using Fakes; using Microsoft.Extensions.Diagnostics.Metrics.Testing; -using NServiceBus; using NUnit.Framework; [TestFixture] diff --git a/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs b/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs index 7864b19..2d414b8 100644 --- a/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs +++ b/src/NServiceBus.Envelope.CloudEvents.Tests/StrictCloudEventJsonStructuredEnvelopeHandlerTests.cs @@ -1,14 +1,11 @@ namespace NServiceBus.Envelope.CloudEvents.Tests; -using System; using System.Buffers; -using System.Collections.Generic; using System.Text; using System.Text.Json; using Extensibility; using Fakes; using Microsoft.Extensions.Diagnostics.Metrics.Testing; -using NServiceBus; using NUnit.Framework; [TestFixture] diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs index 5fe5883..69aec70 100644 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeHandler.cs @@ -1,9 +1,6 @@ namespace NServiceBus.Envelope.CloudEvents; -using System; using System.Buffers; -using System.Collections.Generic; -using System.Linq; using Extensibility; using Logging; diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs index 7124cd2..3935b4e 100644 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeHandler.cs @@ -1,9 +1,6 @@ namespace NServiceBus.Envelope.CloudEvents; -using System; using System.Buffers; -using System.Collections.Generic; -using System.Linq; using Extensibility; using Logging; diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventsFeature.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventsFeature.cs index 9585d34..7f3d25a 100644 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventsFeature.cs +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventsFeature.cs @@ -3,7 +3,6 @@ namespace NServiceBus.Envelope.CloudEvents; using System.Diagnostics.Metrics; using Features; using Microsoft.Extensions.DependencyInjection; -using NServiceBus; class CloudEventsFeature : Feature { diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventsMetrics.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventsMetrics.cs index 61fd62a..8c62772 100644 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventsMetrics.cs +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventsMetrics.cs @@ -1,6 +1,5 @@ namespace NServiceBus.Envelope.CloudEvents; -using System; using System.Diagnostics; using System.Diagnostics.Metrics; From bf3e42cda93aef8bf6e968f8e40349880e00ee07 Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Wed, 21 Jan 2026 09:41:33 +0100 Subject: [PATCH 17/21] Remove redundant elements --- .../CloudEventAmqpBinaryEnvelopeUnwrapper.cs | 2 +- .../CloudEventHttpBinaryEnvelopeUnwrapper.cs | 2 +- .../CloudEventJsonStructuredEnvelopeUnwrapper.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs index e94fa8c..a12e0dd 100644 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventAmqpBinaryEnvelopeUnwrapper.cs @@ -5,7 +5,7 @@ namespace NServiceBus.Envelope.CloudEvents; /// /// Unwrapper for AMQP Binary cloud events envelopes. /// -public class CloudEventAmqpBinaryEnvelopeUnwrapper() : EnvelopeUnwrapper +public class CloudEventAmqpBinaryEnvelopeUnwrapper : EnvelopeUnwrapper { internal override void RegisterUnwrapper(FeatureConfigurationContext context, Action unwrapperDiagnosticWriter) { diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs index 40f7adc..b60d0e4 100644 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventHttpBinaryEnvelopeUnwrapper.cs @@ -5,7 +5,7 @@ namespace NServiceBus.Envelope.CloudEvents; /// /// Unwrapper for HTTP Binary cloud events envelopes. /// -public class CloudEventHttpBinaryEnvelopeUnwrapper() : EnvelopeUnwrapper +public class CloudEventHttpBinaryEnvelopeUnwrapper : EnvelopeUnwrapper { internal override void RegisterUnwrapper(FeatureConfigurationContext context, Action unwrapperDiagnosticWriter) { diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeUnwrapper.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeUnwrapper.cs index 1066aa8..88356ed 100644 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeUnwrapper.cs +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeUnwrapper.cs @@ -5,7 +5,7 @@ namespace NServiceBus.Envelope.CloudEvents; /// /// Unwrapper for JSON Structured cloud events envelopes. /// -public class CloudEventJsonStructuredEnvelopeUnwrapper() : EnvelopeUnwrapper +public class CloudEventJsonStructuredEnvelopeUnwrapper : EnvelopeUnwrapper { internal override void RegisterUnwrapper(FeatureConfigurationContext context, Action unwrapperDiagnosticWriter) { From cdec9f393084b436fdff68991c0bd0ffd8c5a364 Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Wed, 21 Jan 2026 09:42:42 +0100 Subject: [PATCH 18/21] Ensure namespace consistency across acceptance tests --- .../NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj | 1 + .../NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj | 1 + 2 files changed, 2 insertions(+) diff --git a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj index b9cd128..4572534 100644 --- a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj @@ -3,6 +3,7 @@ net10.0 enable + NServiceBus.AcceptanceTests diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj index cc253c9..fbdca61 100644 --- a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj @@ -3,6 +3,7 @@ net10.0 enable + NServiceBus.AcceptanceTests From 1f691eacb83eef416aa274028e7b450914de263c Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Wed, 21 Jan 2026 09:43:33 +0100 Subject: [PATCH 19/21] Include cloud events specific ATTs into transports specific ATT projects --- ...s.Envelope.CloudEvents.ASB.AcceptanceTests.csproj | 12 ++++++++++++ ...s.Envelope.CloudEvents.SQS.AcceptanceTests.csproj | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj index 4572534..adacd01 100644 --- a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj @@ -25,5 +25,17 @@ + + + + CloudEvents\When_amqp_binary_message_received.cs + + + CloudEvents\When_http_binary_message_received.cs + + + CloudEvents\When_json_structured_message_received.cs + + diff --git a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj index 9539f86..d3a5c16 100644 --- a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj @@ -21,5 +21,17 @@ + + + + CloudEvents\When_amqp_binary_message_received.cs + + + CloudEvents\When_http_binary_message_received.cs + + + CloudEvents\When_json_structured_message_received.cs + + From 812ce68dc57f6d552b8d291e22a56c395619d1aa Mon Sep 17 00:00:00 2001 From: Mauro Servienti Date: Wed, 21 Jan 2026 10:45:43 +0100 Subject: [PATCH 20/21] Fix partial comment --- .../CloudEventJsonStructuredEnvelopeUnwrapper.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeUnwrapper.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeUnwrapper.cs index 88356ed..c373b33 100644 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeUnwrapper.cs +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventJsonStructuredEnvelopeUnwrapper.cs @@ -18,7 +18,8 @@ internal override void RegisterUnwrapper(FeatureConfigurationContext context, Ac } /// - /// Determines the envelope handling behavior. In strict mode the unwrapper expects the correct Content-Type header. In permissive mode + /// Determines the envelope handling behavior. In strict mode the unwrapper expects the correct + /// Content-Type header. In permissive mode it always tries to parse the incoming envelope. /// public JsonStructureEnvelopeHandlingMode EnvelopeHandlingMode { get; set; } = JsonStructureEnvelopeHandlingMode.Strict; } \ No newline at end of file From 01add330f4c0592fe08672e5bf9cf4b0af0fe39d Mon Sep 17 00:00:00 2001 From: Adam Furmanek Date: Fri, 23 Jan 2026 15:38:44 +0100 Subject: [PATCH 21/21] Updating packages and making type mapping case insensitive --- ...ServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj | 4 ++-- .../NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj | 2 +- ...ServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj | 4 ++-- .../CloudEventsConfiguration.cs | 2 +- .../NServiceBus.Envelope.CloudEvents.csproj | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj index adacd01..9ac0f00 100644 --- a/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests/NServiceBus.Envelope.CloudEvents.ASB.AcceptanceTests.csproj @@ -15,11 +15,11 @@ - + - + diff --git a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj index fbdca61..d9b174d 100644 --- a/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.AcceptanceTests/NServiceBus.Envelope.CloudEvents.AcceptanceTests.csproj @@ -14,7 +14,7 @@ - + diff --git a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj index d3a5c16..8238141 100644 --- a/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj +++ b/src/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests/NServiceBus.Envelope.CloudEvents.SQS.AcceptanceTests.csproj @@ -9,13 +9,13 @@ - + - + diff --git a/src/NServiceBus.Envelope.CloudEvents/CloudEventsConfiguration.cs b/src/NServiceBus.Envelope.CloudEvents/CloudEventsConfiguration.cs index 1259c32..3d9b71d 100644 --- a/src/NServiceBus.Envelope.CloudEvents/CloudEventsConfiguration.cs +++ b/src/NServiceBus.Envelope.CloudEvents/CloudEventsConfiguration.cs @@ -8,7 +8,7 @@ public class CloudEventsConfiguration /// /// Specify type mappings. Allows the user to map string values from the `type` property in incoming cloud events to a type string that NServiceBus expects. /// - public Dictionary TypeMappings { get; } = []; + public Dictionary TypeMappings { get; } = new([], StringComparer.OrdinalIgnoreCase); /// /// The envelope unwrappers to use to handle incoming message envelops. diff --git a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj index d1eeddf..b6a112c 100644 --- a/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj +++ b/src/NServiceBus.Envelope.CloudEvents/NServiceBus.Envelope.CloudEvents.csproj @@ -7,7 +7,7 @@ - +