三种序列化方式性能比较

一下代码比较了二进制序列化、xml序列化、Protobuf序列化的运行时间,可是代码显得十分冗余,是否有大神可以指点一二,万分感谢

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
using System.Diagnostics;

namespace ProtoBuf
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Person> list = new List<Person>();
            int count = 100;
            double SumTs1 = 0, SumTs2 = 0,SumTs3=0,SumTs4=0,SumTs5=0,SumTs6=0;
            for (var i=0;i<1000;i++)
            {
                var person = new Person
                {
                    Sno = i,
                    Name = "Name" + i,
                    Age = 20 + i,
                    HomeTown="HomeTown"+i,
                    Shool="Shool"+i,
                    Country="Country"+i,
                    Language="Language"+i,
                    Professional="professional"+i,
                    Study="study"+i,
                    FatherName="fatherName"+i,
                    MotherName="motherName"+i
                };
                list.Add(person);
            }
            do
            {
                //binary序列化开始
                DateTime binaryTime1 = System.DateTime.Now;
                BinaryFormatter bf = new BinaryFormatter();
                Stream BinaryStream = new FileStream("e:/person.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);
                //Stream BinaryStream = new MemoryStream();
                bf.Serialize(BinaryStream, list);
                BinaryStream.Close();
                DateTime binaryTime2 = System.DateTime.Now;

                //binary反序列化开始
                DateTime debinaryTime1 = System.DateTime.Now;
                Stream deBinaryStream = new FileStream("e:/person.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
                //Stream deBinaryStream = new MemoryStream();
                object obj =bf.Deserialize(BinaryStream);
                deBinaryStream.Close();
                DateTime debinaryTime2 = System.DateTime.Now;

                //Xml序列化开始
                DateTime XmlTime1 = System.DateTime.Now;
                XmlSerializer xs = new XmlSerializer(typeof(List<Person>));
                Stream XmlStream = new FileStream("e:/2person.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
                xs.Serialize(XmlStream, list);
                XmlStream.Close();
                DateTime XmlTime2 = System.DateTime.Now;

                //Xml反序列化开始
                DateTime deXmlTime1 = System.DateTime.Now;
                XmlSerializer dexs = new XmlSerializer(typeof(List<Person>));
                Stream deXmlStream = new FileStream("e:/2person.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
                //Stream deXmlStream = new MemoryStream();
                List<Person> list2 = (List<Person>)dexs.Deserialize(deXmlStream);
                deXmlStream.Close();
                DateTime deXmlTime2 = System.DateTime.Now;

                //ProtoBuf序列化开始
                DateTime ProtoBufTime1 = System.DateTime.Now;
                Stream ProtoBufStream = new MemoryStream();
                ProtoBuf.Serializer.Serialize(ProtoBufStream, list);
                ProtoBufStream.Close();
                DateTime ProtoBufTime2 = System.DateTime.Now;

                //ProtoBuf反序列化开始
                DateTime deProtoBufTime1 = System.DateTime.Now;
                Stream deProtoBufStream = new MemoryStream();
                Person newPerson = ProtoBuf.Serializer.Deserialize<Person>(deProtoBufStream);
                deProtoBufStream.Close();
                DateTime deProtoBufTime2 = System.DateTime.Now;

                //计算时间和运行次数
                SumTs1 += binaryTime2.Subtract(binaryTime1).TotalMilliseconds;
                SumTs2 += debinaryTime2.Subtract(debinaryTime1).TotalMilliseconds;
                SumTs3 += XmlTime2.Subtract(XmlTime1).TotalMilliseconds;
                SumTs4 += deXmlTime2.Subtract(deXmlTime1).TotalMilliseconds;
                SumTs5 += ProtoBufTime2.Subtract(ProtoBufTime1).TotalMilliseconds;
                SumTs6 += deProtoBufTime2.Subtract(deProtoBufTime1).TotalMilliseconds;
                count--;
            } while (count > 0);

            Console.WriteLine("*********************************序列化比较结果************************************");
            Console.WriteLine("***            binary序列化        Xml序列化         ProtoBuf序列化        ");
            Console.WriteLine("***序列化      "+SumTs1/100+"           "+SumTs3/100+"          "+SumTs5/100);
            Console.WriteLine("***反序列化    "+SumTs2/100+"             "+SumTs4/100+"         "+SumTs6/100);
            Console.WriteLine("**********************************************************************************");
        }
    }

    [ProtoBuf.ProtoContract]
    [Serializable]
    public class Person
    {
        public int Sno { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string HomeTown { get; set; }
        public string Shool { get; set; }
        public string Country{get;set;}
        public string Language{get;set;}
        public string Professional{get;set;}
        public string Study{get;set;}
        public string FatherName{get;set;}
        public string MotherName{get;set;}
    }
}
时间: 2024-10-06 13:58:47

三种序列化方式性能比较的相关文章

PHP5.5三种序列化性能对比

json_encode,serialize,igbinary三种序列化方式,在之前已经有过相关的测试,PHP5.5这方面的测试暂时没有,这次测试基于PHP5.5,并且测试用例,http://blog.csdn.net/hguisu/article/details/7651730的测试用例是一样的,只是从这个测试上家里igbinary serialize的测试,作为对比,可以参考http://www.ooso.net/archives/538 运行环境        PHP5.5 内存 16G 8

NBIoT三种部署方式【转】

转自:https://472880.kuaizhan.com/89/34/p441944286fccf2 本文作者:吴老司撩通信 本文来源:EETOP NB-IoT支持在频段内(In-Band).保护频段(Guard Band)以及独立(Stand-alone)共三种部署方式. 本篇介绍NB的三种部署方式(Operation Modes). 那个谁,你到底叫啥名 关于Operation Modes的翻译问题,列举下:工作模式.工作方式.操作模式.部署方式.部署场景.运行模式……这是非要凑成七个葫

Django框架进阶6 多对多三种创建方式, Ajax, Content-Type前后端传输数据编码格式, Ajax发送文件数据, django内置的序列化功能, Ajax结合sweetalert实现删除二次确认, 批量插入数据, 自定义分页器, ajax结合sweetalert实现删除二次确认

多对多三种创建方式 1.全自动(较为常用) class Book(models.Model): title = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author') # orm就会自动帮你创建第三张表 class Author(models.Model): name = models.CharField(max_length=32) ''' 好处:第三张表自己创建 不足之处:第三张表无法扩展额外

SQL Server 中的三种分页方式

USE tempdb GO SET NOCOUNT ON --创建表结构 IF OBJECT_ID(N'ClassB', N'U') IS NOT NULL DROP TABLE ClassB GO CREATE TABLE ClassB(ID INT PRIMARY KEY, Name VARCHAR(16), CreateDate DATETIME, AID INT, Status INT) CREATE INDEX IDX_CreateDate ON ClassB(CreateDate)

Android中两种序列化方式的比较Serializable和Parcelable

Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用者两种序列化方式.还有,我们需要对象持久化到存储设备或者通过网络传输给其他客户端,这个使用也需要使用Serializale来完成对象的序列化.在Android应用开发中,这两种方式都很常见,但两者方式并不相同. 1.Serializable接口 Serializable接口是Java提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作.使用

垃圾回收(GC)的三种基本方式

垃圾(Garbage)就是程序需要回收的对象,如果一个对象不在被直接或间接地引用,那么这个对象就成为了「垃圾」,它占用的内存需要及时地释放,否则就会引起「内存泄露」.有些语言需要程序员来手动释放内存(回收垃圾),有些语言有垃圾回收机制(GC).本文就来讨论GC实现的三种基本方式. 其实这三种方式也可以大体归为两类:跟踪回收,引用计数.美国IBM的沃森研究中心David F.Bacon等人发布的「垃圾回收统一理论」一文阐述了一个理论:任何垃圾回收的思路,无非以上两种的组合,其中一种的改善和进步,必

Oracle中的三种Join 方式

基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort merge join: 将两个表排序,然后再进行join. Hash join: 将两个表中较小的一个在内存中构造一个Hash 表(对Join Key),扫描另一个表,同样对Join Key进行Hash后探测是否可以join,找出与之匹配的行. 一张小表被hash在内存中.因为数据量小,所以这张小表的大多数数据已经驻入在内存中,剩下的少量数据

Apache HTTP Server 与 Tomcat 的三种连接方式介绍

Apache HTTP Server 与 Tomcat 的三种连接方式介绍 整合 Apache Http Server 和 Tomcat 可以提升对静态文件的处理性能.利用 Web 服务器来做负载均衡以及容错.无缝的升级应用程序.本文介绍了三种整合 Apache 和 Tomcat 的方式. 3 评论: 刘 冬 ([email protected]), 开发工程师, 2007 年 1 月 15 日 内容 首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomca

IIS下PHP的三种配置方式比较

在Windows IIS 6.0下配置PHP,通常有CGI.ISAPI和FastCGI三种配置方式,这三种模式都可以在IIS 6.0下成功运行,下面我就讲一下这三种方式配置的区别和性能上的差异. 1.CGI(通用网关接口/Common Gateway Interface)一般是可执行程序,例如EXE文件,和WEB服务器各自占据着不同的进程,而且一般一个CGI程序只能处理一个用户请求.这样,当用户请求数量非常多时,会大量占用系统的资源,如内存.CPU时间等,造成效能低下. 2.ISAPI(Inte