diff --git a/sdk/core/Azure.Core/perf/Azure.Core.Perf.csproj b/sdk/core/Azure.Core/perf/Azure.Core.Perf.csproj
index 035fa2515d41..c3bd504fdbaa 100644
--- a/sdk/core/Azure.Core/perf/Azure.Core.Perf.csproj
+++ b/sdk/core/Azure.Core/perf/Azure.Core.Perf.csproj
@@ -22,13 +22,13 @@
-
+
Always
-
+
Always
-
+
Always
diff --git a/sdk/core/Azure.Core/perf/RequestContents/ModelContent/LargeModel.cs b/sdk/core/Azure.Core/perf/RequestContents/ModelContent/LargeModel.cs
new file mode 100644
index 000000000000..692b20efa53a
--- /dev/null
+++ b/sdk/core/Azure.Core/perf/RequestContents/ModelContent/LargeModel.cs
@@ -0,0 +1,12 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+using Azure.Core.Tests.Public.ResourceManager.Resources;
+
+namespace Azure.Core.Perf.RequestContents.ModelContent
+{
+ public class LargeModel : ModelContentBenchmark
+ {
+ protected override string JsonFileName => "ResourceProviderData.json";
+ }
+}
diff --git a/sdk/core/Azure.Core/perf/RequestContents/ModelContent/ModelContentBenchmark.cs b/sdk/core/Azure.Core/perf/RequestContents/ModelContent/ModelContentBenchmark.cs
new file mode 100644
index 000000000000..ac3a6acc3819
--- /dev/null
+++ b/sdk/core/Azure.Core/perf/RequestContents/ModelContent/ModelContentBenchmark.cs
@@ -0,0 +1,15 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+using Azure.Core.Serialization;
+
+namespace Azure.Core.Perf.RequestContents.ModelContent
+{
+ public abstract class ModelContentBenchmark : RequestContentBenchmark> where T : class, IModelSerializable
+ {
+ protected override RequestContent CreateRequestContent()
+ {
+ return RequestContent.Create(_model);
+ }
+ }
+}
diff --git a/sdk/core/Azure.Core/perf/RequestContents/ModelContent/SmallModel.cs b/sdk/core/Azure.Core/perf/RequestContents/ModelContent/SmallModel.cs
new file mode 100644
index 000000000000..9165fa610032
--- /dev/null
+++ b/sdk/core/Azure.Core/perf/RequestContents/ModelContent/SmallModel.cs
@@ -0,0 +1,12 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+using Azure.Core.Tests.Public.ResourceManager.Compute;
+
+namespace Azure.Core.Perf.RequestContents.ModelContent
+{
+ public class SmallModel : ModelContentBenchmark
+ {
+ protected override string JsonFileName => "AvailabilitySetData.json";
+ }
+}
diff --git a/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/LargeModel.cs b/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/LargeModel.cs
new file mode 100644
index 000000000000..81bf67044a41
--- /dev/null
+++ b/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/LargeModel.cs
@@ -0,0 +1,12 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+using Azure.Core.Tests.Public.ResourceManager.Resources;
+
+namespace Azure.Core.Perf.RequestContents.ModelJsonContent
+{
+ public class LargeModel : ModelJsonContentBenchmark
+ {
+ protected override string JsonFileName => "ResourceProviderData.json";
+ }
+}
diff --git a/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/ModelJsonContentBenchmark.cs b/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/ModelJsonContentBenchmark.cs
new file mode 100644
index 000000000000..c44d7fb23a22
--- /dev/null
+++ b/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/ModelJsonContentBenchmark.cs
@@ -0,0 +1,15 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+using Azure.Core.Serialization;
+
+namespace Azure.Core.Perf.RequestContents.ModelJsonContent
+{
+ public abstract class ModelJsonContentBenchmark : RequestContentBenchmark> where T : class, IModelJsonSerializable
+ {
+ protected override RequestContent CreateRequestContent()
+ {
+ return RequestContent.Create(_model);
+ }
+ }
+}
diff --git a/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/SmallModel.cs b/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/SmallModel.cs
new file mode 100644
index 000000000000..47b32034d476
--- /dev/null
+++ b/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/SmallModel.cs
@@ -0,0 +1,12 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+using Azure.Core.Tests.Public.ResourceManager.Compute;
+
+namespace Azure.Core.Perf.RequestContents.ModelJsonContent
+{
+ public class SmallModel : ModelJsonContentBenchmark
+ {
+ protected override string JsonFileName => "AvailabilitySetData.json";
+ }
+}
diff --git a/sdk/core/Azure.Core/perf/RequestContents/RequestContentBenchmark.cs b/sdk/core/Azure.Core/perf/RequestContents/RequestContentBenchmark.cs
new file mode 100644
index 000000000000..38f2b2f43a00
--- /dev/null
+++ b/sdk/core/Azure.Core/perf/RequestContents/RequestContentBenchmark.cs
@@ -0,0 +1,60 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+using System;
+using System.IO;
+using System.Reflection;
+using Azure.Core.Serialization;
+using BenchmarkDotNet.Attributes;
+
+namespace Azure.Core.Perf.RequestContents
+{
+ public abstract class RequestContentBenchmark where T : class
+ {
+ protected abstract string JsonFileName { get; }
+ protected abstract RequestContent CreateRequestContent();
+
+ protected T _model;
+ private RequestContent _serializedContent;
+ private MemoryStream _stream;
+
+ [GlobalSetup]
+ public void GlobalSetup()
+ {
+ string json = File.ReadAllText(Path.Combine(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName, "TestData", JsonFileName));
+ Type modelType = typeof(T).GetGenericArguments()[0];
+ _model = ModelSerializer.Deserialize(BinaryData.FromString(json), modelType) as T;
+ _serializedContent = CreateRequestContent();
+ _serializedContent.TryComputeLength(out long length);
+ _stream = new MemoryStream((int)length);
+ }
+
+ [GlobalCleanup]
+ public void GlobalCleanup()
+ {
+ _serializedContent.Dispose();
+ _serializedContent = null;
+ }
+
+ [Benchmark]
+ public void Construct()
+ {
+ using RequestContent content = CreateRequestContent();
+ }
+
+ [Benchmark]
+ public long TryComputeLength()
+ {
+ using RequestContent content = CreateRequestContent();
+ content.TryComputeLength(out long length);
+ return length;
+ }
+
+ [Benchmark]
+ public void WriteTo()
+ {
+ _serializedContent.WriteTo(_stream, default);
+ _stream.Position = 0;
+ }
+ }
+}
diff --git a/sdk/core/Azure.Core/perf/SerializationBenchmark/AvailabilitySetDataBenchmark.cs b/sdk/core/Azure.Core/perf/Serializations/AvailabilitySetDataModel.cs
similarity index 87%
rename from sdk/core/Azure.Core/perf/SerializationBenchmark/AvailabilitySetDataBenchmark.cs
rename to sdk/core/Azure.Core/perf/Serializations/AvailabilitySetDataModel.cs
index 735ac15cc711..007454eb7294 100644
--- a/sdk/core/Azure.Core/perf/SerializationBenchmark/AvailabilitySetDataBenchmark.cs
+++ b/sdk/core/Azure.Core/perf/Serializations/AvailabilitySetDataModel.cs
@@ -4,9 +4,9 @@
using System.Text.Json;
using Azure.Core.Tests.Public.ResourceManager.Compute;
-namespace Azure.Core.Perf
+namespace Azure.Core.Perf.Serializations
{
- public class AvailabilitySetDataBenchmark : JsonSerializationBenchmark
+ public class AvailabilitySetDataModel : JsonBenchmark
{
protected override AvailabilitySetData Deserialize(JsonElement jsonElement)
{
diff --git a/sdk/core/Azure.Core/perf/SerializationBenchmark/SerializationBenchmarkConfig.cs b/sdk/core/Azure.Core/perf/Serializations/BenchmarkConfig.cs
similarity index 74%
rename from sdk/core/Azure.Core/perf/SerializationBenchmark/SerializationBenchmarkConfig.cs
rename to sdk/core/Azure.Core/perf/Serializations/BenchmarkConfig.cs
index 36901ef62427..4468174c3df3 100644
--- a/sdk/core/Azure.Core/perf/SerializationBenchmark/SerializationBenchmarkConfig.cs
+++ b/sdk/core/Azure.Core/perf/Serializations/BenchmarkConfig.cs
@@ -6,11 +6,11 @@
using BenchmarkDotNet.Reports;
using Perfolizer.Horology;
-namespace Azure.Core.Perf
+namespace Azure.Core.Perf.Serializations
{
- internal class SerializationBenchmarkConfig : ManualConfig
+ internal class BenchmarkConfig : ManualConfig
{
- public SerializationBenchmarkConfig()
+ public BenchmarkConfig()
{
SummaryStyle = SummaryStyle.Default
.WithTimeUnit(TimeUnit.Microsecond)
diff --git a/sdk/core/Azure.Core/perf/SerializationBenchmark/BimodalRepro.cs b/sdk/core/Azure.Core/perf/Serializations/BimodalRepro.cs
similarity index 89%
rename from sdk/core/Azure.Core/perf/SerializationBenchmark/BimodalRepro.cs
rename to sdk/core/Azure.Core/perf/Serializations/BimodalRepro.cs
index 3a56b1933bdb..4dc3e56ba61b 100644
--- a/sdk/core/Azure.Core/perf/SerializationBenchmark/BimodalRepro.cs
+++ b/sdk/core/Azure.Core/perf/Serializations/BimodalRepro.cs
@@ -3,7 +3,7 @@
using BenchmarkDotNet.Attributes;
-namespace Azure.Core.Perf
+namespace Azure.Core.Perf.Serializations
{
public class BimodalRepro
{
diff --git a/sdk/core/Azure.Core/perf/SerializationBenchmark/JsonSerializationBenchmark.cs b/sdk/core/Azure.Core/perf/Serializations/JsonBenchmark.cs
similarity index 88%
rename from sdk/core/Azure.Core/perf/SerializationBenchmark/JsonSerializationBenchmark.cs
rename to sdk/core/Azure.Core/perf/Serializations/JsonBenchmark.cs
index 3d1ef1f1baef..a25d8bd2f84c 100644
--- a/sdk/core/Azure.Core/perf/SerializationBenchmark/JsonSerializationBenchmark.cs
+++ b/sdk/core/Azure.Core/perf/Serializations/JsonBenchmark.cs
@@ -2,8 +2,6 @@
// Licensed under the MIT License.
using System;
-using System.Buffers;
-using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;
@@ -13,10 +11,10 @@
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
-namespace Azure.Core.Perf
+namespace Azure.Core.Perf.Serializations
{
[GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)]
- public abstract class JsonSerializationBenchmark where T : class, IModelJsonSerializable
+ public abstract class JsonBenchmark where T : class, IModelJsonSerializable
{
private string _json;
protected T _model;
@@ -24,7 +22,6 @@ public abstract class JsonSerializationBenchmark where T : class, IModelJsonS
protected ModelSerializerOptions _options;
private BinaryData _data;
private SequenceWriter _content;
- private ReadOnlySequence _sequence;
private JsonDocument _jsonDocument;
protected abstract T Deserialize(JsonElement jsonElement);
@@ -40,7 +37,7 @@ public abstract class JsonSerializationBenchmark where T : class, IModelJsonS
[GlobalSetup]
public void SetUp()
{
- _json = File.ReadAllText(Path.Combine(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName, "SerializationBenchmark", "TestData", JsonFileName));
+ _json = File.ReadAllText(Path.Combine(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName, "TestData", JsonFileName));
_data = BinaryData.FromString(_json);
_model = ModelSerializer.Deserialize(_data);
_response = new MockResponse(200);
@@ -50,7 +47,6 @@ public void SetUp()
using Utf8JsonWriter writer = new Utf8JsonWriter(_content);
_model.Serialize(writer, new ModelSerializerOptions());
writer.Flush();
- _sequence = _content.GetReadOnlySequence();
_jsonDocument = JsonDocument.Parse(_json);
}
@@ -176,20 +172,6 @@ public T Deserialize_Utf8JsonReaderFromBinaryData()
return _model.Deserialize(ref reader, _options);
}
- [Benchmark]
- [BenchmarkCategory("JsonDocument")]
- public ReadOnlySequence GetSequence()
- {
- return _content.GetReadOnlySequence();
- }
-
- [Benchmark]
- [BenchmarkCategory("JsonDocument")]
- public void JsonDocumentFromSequence()
- {
- using var doc = JsonDocument.Parse(_sequence);
- }
-
[Benchmark]
[BenchmarkCategory("JsonDocument")]
public void JsonDocumentFromReader()
diff --git a/sdk/core/Azure.Core/perf/SerializationBenchmark/ModelXmlBenchmark.cs b/sdk/core/Azure.Core/perf/Serializations/ModelXmlModel.cs
similarity index 87%
rename from sdk/core/Azure.Core/perf/SerializationBenchmark/ModelXmlBenchmark.cs
rename to sdk/core/Azure.Core/perf/Serializations/ModelXmlModel.cs
index 9b6dcbc82d79..9ca689ce948a 100644
--- a/sdk/core/Azure.Core/perf/SerializationBenchmark/ModelXmlBenchmark.cs
+++ b/sdk/core/Azure.Core/perf/Serializations/ModelXmlModel.cs
@@ -1,14 +1,13 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
-using System;
using System.Xml;
using System.Xml.Linq;
using Azure.Core.Tests.Public.ModelSerializationTests.Models;
-namespace Azure.Core.Perf
+namespace Azure.Core.Perf.Serializations
{
- public class ModelXmlBenchmark : XmlSerializationBenchmark
+ public class ModelXmlModel : XmlBenchmark
{
protected override string XmlFileName => "ModelXml.xml";
diff --git a/sdk/core/Azure.Core/perf/SerializationBenchmark/ResourceProviderDataBenchmark.cs b/sdk/core/Azure.Core/perf/Serializations/ResourceProviderDataModel.cs
similarity index 82%
rename from sdk/core/Azure.Core/perf/SerializationBenchmark/ResourceProviderDataBenchmark.cs
rename to sdk/core/Azure.Core/perf/Serializations/ResourceProviderDataModel.cs
index c28d9ba1e042..229a4594c024 100644
--- a/sdk/core/Azure.Core/perf/SerializationBenchmark/ResourceProviderDataBenchmark.cs
+++ b/sdk/core/Azure.Core/perf/Serializations/ResourceProviderDataModel.cs
@@ -1,15 +1,14 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
-using System;
using System.Text.Json;
using Azure.Core.Tests.Public.ResourceManager.Resources;
using BenchmarkDotNet.Attributes;
-namespace Azure.Core.Perf
+namespace Azure.Core.Perf.Serializations
{
- [Config(typeof(SerializationBenchmarkConfig))]
- public class ResourceProviderDataBenchmark : JsonSerializationBenchmark
+ [Config(typeof(BenchmarkConfig))]
+ public class ResourceProviderDataModel : JsonBenchmark
{
protected override string JsonFileName => "ResourceProviderData.json";
diff --git a/sdk/core/Azure.Core/perf/SerializationBenchmark/XmlSerializationBenchmark.cs b/sdk/core/Azure.Core/perf/Serializations/XmlBenchmark.cs
similarity index 94%
rename from sdk/core/Azure.Core/perf/SerializationBenchmark/XmlSerializationBenchmark.cs
rename to sdk/core/Azure.Core/perf/Serializations/XmlBenchmark.cs
index a9ff0b6f3db6..5b0803983119 100644
--- a/sdk/core/Azure.Core/perf/SerializationBenchmark/XmlSerializationBenchmark.cs
+++ b/sdk/core/Azure.Core/perf/Serializations/XmlBenchmark.cs
@@ -12,10 +12,10 @@
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
-namespace Azure.Core.Perf
+namespace Azure.Core.Perf.Serializations
{
[GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)]
- public abstract class XmlSerializationBenchmark where T : class, IModelSerializable
+ public abstract class XmlBenchmark where T : class, IModelSerializable
{
private string _xml;
protected T _model;
@@ -37,7 +37,7 @@ public abstract class XmlSerializationBenchmark where T : class, IModelSerial
[GlobalSetup]
public void SetUp()
{
- _xml = File.ReadAllText(Path.Combine(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName, "SerializationBenchmark", "TestData", XmlFileName));
+ _xml = File.ReadAllText(Path.Combine(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName, "TestData", XmlFileName));
_data = BinaryData.FromString(_xml);
_model = ModelSerializer.Deserialize(_data);
_response = new MockResponse(200);
diff --git a/sdk/core/Azure.Core/perf/SerializationBenchmark/TestData/AvailabilitySetData.json b/sdk/core/Azure.Core/perf/TestData/AvailabilitySetData.json
similarity index 100%
rename from sdk/core/Azure.Core/perf/SerializationBenchmark/TestData/AvailabilitySetData.json
rename to sdk/core/Azure.Core/perf/TestData/AvailabilitySetData.json
diff --git a/sdk/core/Azure.Core/perf/SerializationBenchmark/TestData/ModelXml.xml b/sdk/core/Azure.Core/perf/TestData/ModelXml.xml
similarity index 100%
rename from sdk/core/Azure.Core/perf/SerializationBenchmark/TestData/ModelXml.xml
rename to sdk/core/Azure.Core/perf/TestData/ModelXml.xml
diff --git a/sdk/core/Azure.Core/perf/SerializationBenchmark/TestData/ResourceProviderData.json b/sdk/core/Azure.Core/perf/TestData/ResourceProviderData.json
similarity index 100%
rename from sdk/core/Azure.Core/perf/SerializationBenchmark/TestData/ResourceProviderData.json
rename to sdk/core/Azure.Core/perf/TestData/ResourceProviderData.json
diff --git a/sdk/core/Azure.Core/src/Internal/SequenceWriterAccess.cs b/sdk/core/Azure.Core/src/Internal/SequenceWriterAccess.cs
new file mode 100644
index 000000000000..8da747ab8ee9
--- /dev/null
+++ b/sdk/core/Azure.Core/src/Internal/SequenceWriterAccess.cs
@@ -0,0 +1,106 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+using System.IO;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
+using Azure.Core.Serialization;
+
+namespace Azure.Core.Internal
+{
+ internal sealed class SequenceWriterAccess
+ {
+ private readonly IModelJsonSerializable