JSON.NET VS BinaryFormatter 性能

来源:互联网 发布:手机淘宝店铺怎么登录 编辑:程序博客网 时间:2024/05/01 03:44

近期有个性能调优工作。通过dottrace 分析,发现几处问题,其中json.net 在序列化和反序列化的时候也比较耗性能,所以考虑能不能通过其它序列化方式来提高性能。

 

1 object 序列化代码 

    public class ObjectConvert    {        /// <summary>         /// 将一个object对象序列化,返回一个byte[]                 /// </summary>         /// <param name="obj">能序列化的对象</param>                 /// <returns></returns>         public static byte[] ObjectToBytes(object obj)        {            using (MemoryStream ms = new MemoryStream())            {                IFormatter formatter = new BinaryFormatter();                formatter.Serialize(ms, obj); return ms.GetBuffer();            }        }        /// <summary>         /// 将一个序列化后的byte[]数组还原                 /// </summary>        /// <param name="Bytes"></param>                 /// <returns></returns>         public static object BytesToObject(byte[] Bytes)        {            using (MemoryStream ms = new MemoryStream(Bytes))            {                IFormatter formatter = new BinaryFormatter();                return formatter.Deserialize(ms);            }        }    }

2 Test 方法,用了 老赵写的codetimer

    [TestClass]    public class SerializeTestor    {        private List<UserInfo> InitData(int count)        {            UserInfo user = null;            List<UserInfo> users = new List<UserInfo>();            for (int i = 0; i < count; i++)            {                user = new UserInfo();                user.Age = new Random().Next(10, 100);                user.Name = "yuan";                user.CreateTime = DateTime.Now;                users.Add(user);            }            return users;        }        private List<UserInfo> InitBigStringData(int count)        {            UserInfo user = null;            List<UserInfo> users = new List<UserInfo>();            for (int i = 0; i < count; i++)            {                user = new UserInfo();                user.Age = new Random().Next(10, 100);                //user.Name = "yuan";                user.Name = "yudddddddddddddddddddddddddddyudddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddanyudddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddanyudddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddanyudddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddanddddddddddddddddddddddddddddddddddddddddddddddddddan";                user.CreateTime = DateTime.Now;                users.Add(user);            }            return users;        }        [TestMethod]        public void Serialize_十万次_Test()        {            var users = InitData(100000);            // object序列化            CodeTimer.Time("object序列化", 1, () =>            {                var temps = ObjectConvert.ObjectToBytes(users);            });            // newtonsoft.json            CodeTimer.Time("json.net序列化", 1, () =>             {                 var temps = JsonConvert.SerializeObject(users);             });        }        [TestMethod]        public void Serialize_百万次_Test()        {            var users = InitData(1000000);            // object序列化            CodeTimer.Time("object序列化", 1, () =>            {                var temps = ObjectConvert.ObjectToBytes(users);            });            // newtonsoft.json            CodeTimer.Time("json.net序列化", 1, () =>            {                var temps = JsonConvert.SerializeObject(users);            });        }        [TestMethod]        public void SerializeBigString_十万次_Test()        {            var users = InitBigStringData(100000);            // object序列化            CodeTimer.Time("object序列化", 1, () =>            {                var temps = ObjectConvert.ObjectToBytes(users);            });            // newtonsoft.json            CodeTimer.Time("json.net序列化", 1, () =>            {                var temps = JsonConvert.SerializeObject(users);            });        }        [TestMethod]        public void SerializeBigString_百万次_Test()        {            var users = InitBigStringData(1000000);            // object序列化            CodeTimer.Time("object序列化", 1, () =>            {                var temps = ObjectConvert.ObjectToBytes(users);            });            // newtonsoft.json            CodeTimer.Time("json.net序列化", 1, () =>            {                var temps = JsonConvert.SerializeObject(users);            });        }     }

  

3 测试结果:

Serialize_十万次_Test:object序列化Time Elapsed:188msTime Elapsed (one time):188msCPU time:187,500,000nsCPU time (one time):187,500,000nsGen 0: 1Gen 1: 0Gen 2: 0json.net序列化Time Elapsed:138msTime Elapsed (one time):138msCPU time:140,625,000nsCPU time (one time):140,625,000nsGen 0: 3Gen 1: 1Gen 2: 0================================================Serialize_百万次_Testobject序列化Time Elapsed:2,073msTime Elapsed (one time):2,073msCPU time:2,078,125,000nsCPU time (one time):2,078,125,000nsGen 0: 23Gen 1: 1Gen 2: 0json.net序列化Time Elapsed:1,449msTime Elapsed (one time):1,449msCPU time:1,437,500,000nsCPU time (one time):1,437,500,000nsGen 0: 28Gen 1: 27Gen 2: 0===================================================SerializeBigString_十万次_Testobject序列化Time Elapsed:187msTime Elapsed (one time):187msCPU time:187,500,000nsCPU time (one time):187,500,000nsGen 0: 3Gen 1: 2Gen 2: 2json.net序列化Time Elapsed:339msTime Elapsed (one time):339msCPU time:328,125,000nsCPU time (one time):328,125,000nsGen 0: 19Gen 1: 14Gen 2: 3======================================================SerializeBigString_百万次_Testobject序列化Time Elapsed:2,099msTime Elapsed (one time):2,099msCPU time:2,046,875,000nsCPU time (one time):2,046,875,000nsGen 0: 26Gen 1: 25Gen 2: 3json.net序列化    System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常。

  

4 结论:

JSON.NET 在小对象处理时,性能比BinaryFormatter好

JSON.NET 比 BinaryFormatter  耗内存

JSON.NET  GC中带回收的对象会比较影响整体性能

 

0 0