zoukankan      html  css  js  c++  java
  • DataContractSerializer vs XmlSerializer vs DataContractJsonSerializer vs SoapFormatter vs BinaryFormatter 性能测试对比

    
    namespace Test
    {
        using System;
        using System.Runtime.Serialization;
        using System.Runtime.Serialization.Json;
        using System.Text;
        using System.Xml;
        using System.Xml.Serialization;
        using Microshaoft;
        using Test.Share;
        public class Class1
        {
            static WebDirectory _wd = null;
            static void Main(string[] args)
            {
                WebDirectory x = new WebDirectory();
                x.Name = "Microshaoft";
                DateTime now = DateTime.Now;
                WebFile y1 = new WebFile();
                y1.Name = "Microshaoft简体繁體中文";
                y1.IsReadOnly = false;
                y1.Url = "http://www.microshaoft.com";
                y1.CreateTime = now;
                y1.LastWriteTime = now;
                WebDirectory x1 = new WebDirectory();
                x1.Name = "Sub1";
                //y1.Directory = x; //循环引用
                WebFile y2 = new WebFile();
                y2.Name = "Microshaoft中文";
                y2.Flag = FlagEnum.Value2;
                y2.CreateTime = now;
                y2.LastWriteTime = now;
                WebFile[] a = new WebFile[2];
                a[0] = y1;
                a[1] = y2;
                x.WebFiles = a;
                _wd = x;
                int iteration = 10000;
                Type t = _wd.GetType();
                int length = 0;
                XmlSerializer serializer1 = new XmlSerializer(t);
                CodeTimer.ParallelTime
                            (
                                "TestXmlSerializer"
                                , iteration
                                , () =>
                                {
                                    length = TestXmlSerializerOnce(serializer1);
                                }
                            );
                Console.WriteLine("Length: {0}", length);
                DataContractSerializer serializer2 = new DataContractSerializer(t);
                CodeTimer.ParallelTime
                            (
                                "TestDataContractSerializer"
                                , iteration
                                , () =>
                                {
                                    length = TestDataContractSerializerOnce(serializer2);
                                }
                            );
                Console.WriteLine("Length: {0}", length);
                DataContractJsonSerializer serializer3 = new DataContractJsonSerializer(t);
                CodeTimer.ParallelTime
                            (
                                "TestDataContractJsonSerializer"
                                , iteration
                                , () =>
                                {
                                    length = TestDataContractJsonSerializerOnce(serializer3);
                                }
                            );
                Console.WriteLine("Length: {0}", length);
                CodeTimer.ParallelTime
                            (
                                "TestSoapFormatter"
                                , iteration
                                , () =>
                                {
                                    length = TestSoapFormatterOnce();
                                }
                            );
                Console.WriteLine("Length: {0}", length);
                CodeTimer.ParallelTime
                            (
                                "TestBinaryFormatter"
                                , iteration
                                , () =>
                                {
                                    length = TestBinaryFormatterOnce();
                                }
                            );
                Console.WriteLine("Length: {0}", length);
                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine("Hello World");
                Console.WriteLine(Environment.Version.ToString());
                Console.ReadLine();
            }
            static int TestXmlSerializerOnce(XmlSerializer serializer)
            {
                string xml = string.Empty;
                xml = SerializerHelper.XmlSerializerObjectToXml<WebDirectory>
                                                (
                                                    _wd
                                                    , serializer
                                                    , new XmlWriterSettings()
                                                        {
                                                            // = true
                                                            OmitXmlDeclaration = true
                                                            , Encoding= Encoding.UTF8
                                                        }
                                                );
                //Console.WriteLine(xml.Length);
                WebDirectory wd = SerializerHelper.XmlSerializerXmlToObject<WebDirectory>(xml, serializer);
                return xml.Length;
            }
            static int TestDataContractSerializerOnce(DataContractSerializer serializer)
            {
                string xml = string.Empty;
                xml = SerializerHelper.DataContractSerializerObjectToXml<WebDirectory>(_wd, serializer);
                //Console.WriteLine(xml.Length);
                WebDirectory wd = SerializerHelper.DataContractSerializerXmlToObject<WebDirectory>(xml, serializer);
                return xml.Length;
            }
            static int TestDataContractJsonSerializerOnce(DataContractJsonSerializer serializer)
            {
                string json = string.Empty;
                json = SerializerHelper.DataContractSerializerObjectToJson<WebDirectory>(_wd, serializer);
                //Console.WriteLine(xml.Length);
                WebDirectory wd = SerializerHelper.DataContractSerializerJsonToObject<WebDirectory>(json, serializer);
                return json.Length;
            }
            static int TestSoapFormatterOnce()
            {
                string soap = string.Empty;
                soap = SerializerHelper.FormatterObjectToSoap<WebDirectory>(_wd);
                //Console.WriteLine(xml.Length);
                WebDirectory wd = SerializerHelper.FormatterSoapToObject<WebDirectory>(soap);
                return soap.Length;
            }
            static int TestBinaryFormatterOnce()
            {
                byte[] buffer;
                //xml = SerializerHelper.XmlSerializerObjectToXml<WebDirectory>(_wd, Encoding.UTF8);
                //WebDirectory wd = SerializerHelper.XmlSerializerXmlToObject<WebDirectory>(xml);
                buffer = SerializerHelper.FormatterObjectToBinary<WebDirectory>(_wd);
                //Console.WriteLine(xml.Length);
                WebDirectory wd = SerializerHelper.FormatterBinaryToObject<WebDirectory>(buffer);
                return buffer.Length;
            }
        }
    }
    namespace Microshaoft
    {
        using System;
        using System.Diagnostics;
        using System.Runtime.InteropServices;
        using System.Threading;
        using System.Threading.Tasks;
        public static class CodeTimer
        {
            public static void Initialize()
            {
                Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
                Thread.CurrentThread.Priority = ThreadPriority.Highest;
                Time("", 1, () => { });
            }
            public static void ParallelTime(string name, int iteration, Action action)
            {
                InternalIterationProcess
                         (
                            name
                            , iteration
                            , () =>
                            {
                                Parallel.For
                                        (
                                            0
                                            , iteration
                                            , new ParallelOptions()
                                            {
                                                MaxDegreeOfParallelism = 1
                                                //, TaskScheduler = null
                                            }
                                                    , i =>
                                                    {
                                                        action();
                                                    }
                                        );
                            }
                        );
            }
            private static void InternalIterationProcess(string name, int iteration, Action action)
            {
                if (string.IsNullOrEmpty(name))
                {
                    return;
                }
                // 1.
                ConsoleColor currentForeColor = Console.ForegroundColor;
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine(name);
                // 2.
                GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
                int[] gcCounts = new int[GC.MaxGeneration + 1];
                for (int i = 0; i <= GC.MaxGeneration; i++)
                {
                    gcCounts[i] = GC.CollectionCount(i);
                }
                // 3.
                Stopwatch watch = new Stopwatch();
                watch.Start();
                ulong cycleCount = GetCycleCount();
                action();
                ulong cpuCycles = GetCycleCount() - cycleCount;
                watch.Stop();
                // 4.
                Console.ForegroundColor = currentForeColor;
                Console.WriteLine
                                (
                                    "{0}Time Elapsed:{0}{1}ms"
                                    , "\t"
                                    , watch.ElapsedMilliseconds.ToString("N0")
                                );
                Console.WriteLine
                                (
                                    "{0}CPU Cycles:{0}{1}"
                                    , "\t"
                                    , cpuCycles.ToString("N0")
                                );
                // 5.
                for (int i = 0; i <= GC.MaxGeneration; i++)
                {
                    int count = GC.CollectionCount(i) - gcCounts[i];
                    Console.WriteLine
                                (
                                    "{0}Gen {1}: {0}{0}{2}"
                                    , "\t"
                                    , i
                                    , count
                                );
                }
                Console.WriteLine();
            }
            public static void Time(string name, int iteration, Action action)
            {
                InternalIterationProcess
                                    (
                                        name
                                        , iteration
                                        , () =>
                                        {
                                            for (int i = 0; i < iteration; i++)
                                            {
                                                action();
                                            }
                                        }
                                    );
            }
            private static ulong GetCycleCount()
            {
                ulong cycleCount = 0;
                QueryThreadCycleTime(GetCurrentThread(), ref cycleCount);
                return cycleCount;
            }
            [DllImport("kernel32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool QueryThreadCycleTime(IntPtr threadHandle, ref ulong cycleTime);
            [DllImport("kernel32.dll")]
            static extern IntPtr GetCurrentThread();
        }
    }
    namespace Test.Share
    {
        using System;
        using System.Runtime.Serialization;
        using System.Xml.Serialization;
        [XmlRoot("WebDirectory")]
        [Serializable]
        [DataContract]
        public class WebDirectory
        {
            [XmlAttribute("Name")]
            [DataMember]
            public string Name;
            [XmlArrayItem("WebFile", typeof(WebFile))]
            [XmlArray("WebFiles")]
            [DataMember]
            public WebFile[] WebFiles;
        }
        [DataContract]
        public enum FlagEnum : uint
        {
            [EnumMember]
            Value1
            ,
            [EnumMember]
            Value2
        }
        [Serializable]
        [DataContract]
        public class WebFile
        {
            [XmlAttribute("Name")]
            [DataMember]
            public string Name;
            [XmlAttribute("CreateTime")]
            [DataMember]
            public DateTime CreateTime;
            [XmlAttribute("LastWriteTime")]
            [XmlIgnore()]
            [DataMember]
            public DateTime LastWriteTime;
            [XmlAttribute("Length")]
            [DataMember]
            public long Length;
            //[XmlAttribute("Url")]
            [XmlElement("Url")]
            [DataMember]
            public string Url;
            [XmlAttribute("IsReadOnly")]
            [DataMember]
            public bool IsReadOnly;
            [XmlAttribute("Flag")]
            [DataMember]
            public FlagEnum Flag;
            [XmlElement("Directory")]
            [DataMember]
            public WebDirectory Directory;
        }
    }
    namespace Microshaoft
    {
        using System.IO;
        using System.Runtime.Serialization;
        using System.Runtime.Serialization.Formatters.Binary;
        using System.Runtime.Serialization.Formatters.Soap;
        using System.Runtime.Serialization.Json;
        using System.Text;
        using System.Xml;
        using System.Xml.Serialization;
        public static class SerializerHelper
        {
            public static T XmlSerializerXmlToObject<T>(string xml, XmlSerializer serializer = null)
            {
                StringReader stringReader = new StringReader(xml);
                XmlReader xmlReader = XmlReader.Create(stringReader);
                if (serializer == null)
                {
                    serializer = new XmlSerializer(typeof(T));
                }
                return (T) serializer.Deserialize(xmlReader);
            }
            public static string XmlSerializerObjectToXml<T>(T target, XmlSerializer serializer = null, XmlWriterSettings settings = null)
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    using (XmlWriter writer = XmlTextWriter.Create(stream, settings))
                    {
                        if (serializer == null)
                        {
                            serializer = new XmlSerializer(typeof(T));
                        }
                        serializer.Serialize(writer, target);
                        byte[] buffer = StreamDataHelper.ReadDataToBytes(stream);
                        if (settings == null)
                        {
                            settings = writer.Settings;
                        }
                        var e = settings.Encoding;
                        var p = e.GetPreamble().Length;
                        string s = e.GetString(buffer, p, buffer.Length - p);
                        writer.Close();
                        return s;
                    }
                }
            }
            public static string DataContractSerializerObjectToXml<T>(T target, DataContractSerializer serializer)
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    serializer.WriteObject(ms, target);
                    byte[] buffer = StreamDataHelper.ReadDataToBytes(ms);
                    string xml = Encoding.UTF8.GetString(buffer);
                    ms.Close();
                    return xml;
                }
            }
            public static string DataContractSerializerObjectToXml<T>(T target)
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                string xml = DataContractSerializerObjectToXml<T>(target, serializer);
                return xml;
            }
            public static T DataContractSerializerXmlToObject<T>(string xml, DataContractSerializer serializer)
            {
                byte[] buffer = Encoding.UTF8.GetBytes(xml);
                using (MemoryStream ms = new MemoryStream(buffer))
                {
                    T target = (T) serializer.ReadObject(ms);
                    ms.Close();
                    return target;
                }
            }
            public static T DataContractSerializerXmlToObject<T>(string xml)
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                byte[] buffer = Encoding.UTF8.GetBytes(xml);
                using (MemoryStream ms = new MemoryStream(buffer))
                {
                    T target = (T) serializer.ReadObject(ms);
                    ms.Close();
                    return target;
                }
            }
            public static string FormatterObjectToSoap<T>(T target)
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    SoapFormatter formatter = new SoapFormatter();
                    formatter.Serialize(stream, target);
                    string soap = Encoding.UTF8.GetString(stream.GetBuffer());
                    return soap;
                }
            }
            public static T FormatterSoapToObject<T>
                                        (
                                            string soap
                                        )
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    SoapFormatter formater = new SoapFormatter();
                    byte[] data = Encoding.UTF8.GetBytes(soap);
                    stream.Write(data, 0, data.Length);
                    stream.Position = 0;
                    T target = (T) formater.Deserialize(stream);
                    return target;
                }
            }
            public static byte[] FormatterObjectToBinary<T>
                                        (
                                            T target
                                        )
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    BinaryFormatter formater = new BinaryFormatter();
                    formater.Serialize(stream, target);
                    byte[] buffer = stream.ToArray();
                    return buffer;
                }
            }
            public static T FormatterBinaryToObject<T>
                                        (
                                            byte[] data
                                        )
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    BinaryFormatter formater = new BinaryFormatter();
                    stream.Write(data, 0, data.Length);
                    stream.Position = 0;
                    T target = (T) formater.Deserialize(stream);
                    return target;
                }
            }
            public static string DataContractSerializerObjectToJson<T>(T target)
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
                string json = DataContractSerializerObjectToJson<T>(target);
                return json;
            }
            public static string DataContractSerializerObjectToJson<T>(T target, DataContractJsonSerializer serializer)
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    serializer.WriteObject(ms, target);
                    string json = Encoding.UTF8.GetString(ms.GetBuffer());
                    ms.Close();
                    return json;
                }
            }
            public static T DataContractSerializerJsonToObject<T>(string json)
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
                T target = DataContractSerializerJsonToObject<T>(json, serializer);
                return target;
            }
            public static T DataContractSerializerJsonToObject<T>(string json, DataContractJsonSerializer serializer)
            {
                MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
                T target = (T) serializer.ReadObject(ms);
                ms.Close();
                ms.Dispose();
                ms = null;
                return target;
            }
        }
    }
    namespace Microshaoft
    {
        using System.IO;
        public static class StreamDataHelper
        {
            public static byte[] ReadDataToBytes(Stream stream)
            {
                byte[] buffer = new byte[64 * 1024];
                MemoryStream ms = new MemoryStream();
                int r = 0;
                int l = 0;
                long position = -1;
                if (stream.CanSeek)
                {
                    position = stream.Position;
                    stream.Position = 0;
                }
                while (true)
                {
                    r = stream.Read(buffer, 0, buffer.Length);
                    if (r > 0)
                    {
                        l += r;
                        ms.Write(buffer, 0, r);
                    }
                    else
                    {
                        break;
                    }
                }
                byte[] bytes = new byte[l];
                ms.Position = 0;
                ms.Read(bytes, 0, (int)l);
                ms.Close();
                ms.Dispose();
                ms = null;
                if (position >= 0)
                {
                    stream.Position = position;
                }
                return bytes;
            }
        }
    }
    
    
  • 相关阅读:
    python的正负无穷float("inf")的用法
    python中几个常见的黑盒子之“字典dict” 与 “集合set”
    python中几个常见的“黑盒子”之 列表list
    Python 排序---sort与sorted学习
    django中使用Profile扩展User模块(基于django 1.10版本下)
    获取Linux进程运行在哪个CPU内核上面的方法
    【转】Crontab定时任务配置
    【转】sudo命令情景分析
    【转】详解Python的装饰器
    一步步来配置安卓开发环境ADTBundle
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/2435489.html
Copyright © 2011-2022 走看看