diff --git a/src/benchmarks/micro/Serializers/Xml_FromStream.cs b/src/benchmarks/micro/Serializers/Xml_FromStream.cs index 9cd0412a97..33265e1f6c 100644 --- a/src/benchmarks/micro/Serializers/Xml_FromStream.cs +++ b/src/benchmarks/micro/Serializers/Xml_FromStream.cs @@ -26,6 +26,8 @@ public class Xml_FromStream private XmlSerializer xmlSerializer; private DataContractSerializer dataContractSerializer; private MemoryStream memoryStream; + private byte[] memoryBytes; + private XmlDictionaryReader xmlDictionaryReader; [GlobalSetup(Target = nameof(XmlSerializer_))] public void SetupXmlSerializer() @@ -63,9 +65,35 @@ public T DataContractSerializer_() return (T)dataContractSerializer.ReadObject(memoryStream); } - // YAXSerializer is not included in the benchmarks because it does not allow to deserialize from stream (only from file and string) + [GlobalSetup(Target = nameof(DataContractSerializer_BinaryXml_))] + public void SetupDataContractSerializer_BinaryXml_() + { + value = DataGenerator.Generate(); + memoryStream = new MemoryStream(capacity: short.MaxValue); + memoryStream.Position = 0; + dataContractSerializer = new DataContractSerializer(typeof(T)); + using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(memoryStream, null, null, ownsStream: false)) + dataContractSerializer.WriteObject(writer, value); + + memoryBytes = memoryStream.ToArray(); + xmlDictionaryReader = XmlDictionaryReader.CreateBinaryReader(memoryBytes, XmlDictionaryReaderQuotas.Max); + } + + [BenchmarkCategory(Categories.Libraries)] + [Benchmark(Description = nameof(XmlDictionaryReader))] + public T DataContractSerializer_BinaryXml_() + { + ((IXmlBinaryReaderInitializer)xmlDictionaryReader).SetInput(memoryBytes, 0, memoryBytes.Length, null, XmlDictionaryReaderQuotas.Max, null, null); + return (T)dataContractSerializer.ReadObject(xmlDictionaryReader); + } + + // YAXSerializer is not included in the benchmarks because it does not allow to deserialize from stream (only from file and string) [GlobalCleanup] - public void Cleanup() => memoryStream.Dispose(); + public void Cleanup() + { + xmlDictionaryReader?.Dispose(); + memoryStream?.Dispose(); + } } } diff --git a/src/benchmarks/micro/Serializers/Xml_ToStream.cs b/src/benchmarks/micro/Serializers/Xml_ToStream.cs index e00a823fcc..622212c58d 100644 --- a/src/benchmarks/micro/Serializers/Xml_ToStream.cs +++ b/src/benchmarks/micro/Serializers/Xml_ToStream.cs @@ -25,6 +25,7 @@ public class Xml_ToStream private T value; private XmlSerializer xmlSerializer; private DataContractSerializer dataContractSerializer; + private XmlDictionaryWriter xmlDictionaryWriter; private MemoryStream memoryStream; [GlobalSetup] @@ -34,6 +35,7 @@ public void Setup() memoryStream = new MemoryStream(capacity: short.MaxValue); xmlSerializer = new XmlSerializer(typeof(T)); dataContractSerializer = new DataContractSerializer(typeof(T)); + xmlDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(memoryStream, null, null, ownsStream: false); } [BenchmarkCategory(Categories.Libraries, Categories.Runtime)] @@ -52,9 +54,23 @@ public void DataContractSerializer_() dataContractSerializer.WriteObject(memoryStream, value); } + [BenchmarkCategory(Categories.Libraries)] + [Benchmark(Description = nameof(XmlDictionaryWriter))] + public void DataContractSerializer_BinaryXml_() + { + memoryStream.Position = 0; + ((IXmlBinaryWriterInitializer)xmlDictionaryWriter).SetOutput(memoryStream, null, null, ownsStream: false); + + dataContractSerializer.WriteObject(xmlDictionaryWriter, value); + } + // YAXSerializer is not included in the benchmarks because it does not allow to serialize to stream (only to file and string) [GlobalCleanup] - public void Dispose() => memoryStream.Dispose(); + public void Dispose() + { + xmlDictionaryWriter?.Dispose(); + memoryStream?.Dispose(); + } } }