C# Serialization performance in System.Runtime.Serialization.Formatters.Binary.BinaryFormatter,Newtonsoft.Json.JsonConvert and System.Text.Json.JsonSerializer.Serialize

复制代码
In .net core 3.0

using System;
using System.Collections.Generic;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using System.Text;
using System.Text.Json;
using Google.Protobuf;
using System.Diagnostics;
using ConsoleApp389.Models;



namespace ConsoleApp389
{
class Program
{
static void Main(string[] args)
{
TestCostDemo();
Console.ReadLine();
}


static void TestCostDemo()
{
List<SalesOrderDetail> dataList = GetList();
StringBuilder msgBuilder = new StringBuilder();
Stopwatch sw = new Stopwatch();
//sw.Start();
//Console.WriteLine($"BinaryFormatterDemo started at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
//BinaryFormatterDemo<SalesOrderDetail>(dataList);
//sw.Stop();
//Console.WriteLine($"BinaryFormatterDemo stopped at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
//msgBuilder.AppendLine($"BinaryFormatterDemo cost {sw.ElapsedMilliseconds} milliseconds.");


sw.Restart();
Console.WriteLine($"NewtonJsonDemo started at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
NewtonJsonDemo<SalesOrderDetail>(dataList);
sw.Stop();
Console.WriteLine($"NewtonJsonDemo stopped at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
msgBuilder.AppendLine($"NewtonJsonDemo cost {sw.ElapsedMilliseconds} milliseconds.");


sw.Restart();
Console.WriteLine($"JsonSerializerDemo started at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
JsonSerializerDemo<SalesOrderDetail>(dataList);
sw.Stop();
Console.WriteLine($"JsonSerializerDemo stopped at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
msgBuilder.AppendLine($"JsonSerializerDemo cost {sw.ElapsedMilliseconds} milliseconds.");
string msg = msgBuilder.ToString();
Console.WriteLine(msg);
System.Diagnostics.Debug.WriteLine(msg);
}


static List<SalesOrderDetail> GetList()
{
using(AdventureWorks2017Context db=new AdventureWorks2017Context())
{
List<SalesOrderDetail> dataList = new List<SalesOrderDetail>(db.SalesOrderDetail);
return dataList;
}
}


static void BinaryFormatterDemo<T>(List<T> dataList)
{
using (FileStream fs = new FileStream($"{Guid.NewGuid().ToString().Substring(0,6)}.bin", FileMode.Create))
{
BinaryFormatter binFormatter = new BinaryFormatter();
try
{
binFormatter.Serialize(fs, dataList);
}
catch(SerializationException e)
{
Console.WriteLine($"BinaryFormatter serialize ex:{e.StackTrace}");
}
}
}


static void NewtonJsonDemo<T>(List<T> dataList)
{
try
{
string jsonString = JsonConvert.SerializeObject(dataList);
}
catch(SerializationException ex)
{
Console.WriteLine($"NewtonJson serialization ex :{ex.StackTrace}");
}
}


static void JsonSerializerDemo<T>(List<T> dataList)
{
try
{
string msJsonSerializerString = System.Text.Json.JsonSerializer.Serialize(dataList);
}
catch(SerializationException ex)
{
Console.WriteLine($"System.Text.Json.JsonSerializer ex:{ex.StackTrace}");
}
}



//static void GoogleProtoBufDemo<T>(List<T> dataList)
//{
// using (var file = File.Create("person.bin"))
// {
// ProtoBuf.Serializer.Serialize<T>(file, dataList);
// }
//}


}
}

 
复制代码

 

In .net 4.8

 

复制代码
using ConsoleApp390.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp390
{
    class Program
    {
        static void Main(string[] args)
        {
            TestCostDemo();
            Console.ReadLine();
        }

        static void TestCostDemo()
        {
            List<SalesOrderDetail> dataList = GetList();
            StringBuilder msgBuilder = new StringBuilder();
            Stopwatch sw = new Stopwatch();
            //sw.Start();
            //Console.WriteLine($"BinaryFormatterDemo started at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
            //BinaryFormatterDemo<SalesOrderDetail>(dataList);
            //sw.Stop();
            //Console.WriteLine($"BinaryFormatterDemo stopped at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
            //msgBuilder.AppendLine($"BinaryFormatterDemo cost {sw.ElapsedMilliseconds} milliseconds.");

            sw.Restart();
            Console.WriteLine($"NewtonJsonDemo started at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
            NewtonJsonDemo<SalesOrderDetail>(dataList);
            sw.Stop();
            Console.WriteLine($"NewtonJsonDemo stopped at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
            msgBuilder.AppendLine($"NewtonJsonDemo cost {sw.ElapsedMilliseconds} milliseconds.");

            sw.Restart();
            Console.WriteLine($"JsonSerializerDemo started at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
            JsonSerializerDemo<SalesOrderDetail>(dataList);
            sw.Stop();
            Console.WriteLine($"JsonSerializerDemo stopped at {DateTime.Now.ToString("yyyyMMddHHmmssffff")}");
            msgBuilder.AppendLine($"JsonSerializerDemo cost {sw.ElapsedMilliseconds} milliseconds.");
            string msg = msgBuilder.ToString();
            Console.WriteLine(msg);
            System.Diagnostics.Debug.WriteLine(msg);
        }
        static List<SalesOrderDetail> GetList()
        {
            using (AdventureWorks2017Entities db = new AdventureWorks2017Entities())
            {
                List<SalesOrderDetail> dataList = new List<SalesOrderDetail>(db.SalesOrderDetails);
                return dataList;
            }
        }
        static void BinaryFormatterDemo<T>(List<T> dataList)
        {
            using (FileStream fs = new FileStream($"{Guid.NewGuid().ToString().Substring(0, 6)}BinFormatter.dat", FileMode.Create))
            {
                BinaryFormatter binFormatter = new BinaryFormatter();
                try
                {
                    binFormatter.Serialize(fs, dataList);
                }
                catch (SerializationException e)
                {
                    Console.WriteLine($"BinaryFormatter serialize ex:{e.StackTrace}");
                }
            }
        }
        static void NewtonJsonDemo<T>(List<T> dataList)
        {
            try
            {
                string jsonString = JsonConvert.SerializeObject(dataList);
            }
            catch (SerializationException ex)
            {
                Console.WriteLine($"NewtonJson serialization ex :{ex.StackTrace}");
            }
        }
        static void JsonSerializerDemo<T>(List<T> dataList)
        {
            try
            {
                string msJsonSerializerString = System.Text.Json.JsonSerializer.Serialize(dataList);
            }
            catch (SerializationException ex)
            {
                Console.WriteLine($"System.Text.Json.JsonSerializer ex:{ex.StackTrace}");
            }
        }
    }
}
复制代码

 

 Test them in program.

复制代码
 
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp391
{
    class Program
    {
        static void Main(string[] args)
        {
            TestNet48Demo();
            if(IsFirstFinished)
            {
                TestCore30Demo();
            }
        }

        static bool IsBusy= false;

        static bool IsFirstFinished = false;
        static  void TestNet48Demo()
        {
            for (int i = 0; i < 10; i++)
            {
                if (!IsBusy)
                {
                    Console.WriteLine($"Test Net48Demo() {i}");
                    IsBusy = true;
                    Thread thread = new Thread(() =>
                      {
                          Net48Demo();
                      });
                    thread.Start();
                    thread.Join();
                    while(thread.ThreadState!=System.Threading.ThreadState.Stopped)
                    {}

                    if(thread.ThreadState==System.Threading.ThreadState.Stopped)
                    {
                        IsBusy = false;
                    }
                }
            }

            IsFirstFinished = true;
        }

        static void Net48Demo()
        {
            string net48Name = @"D:\C\ConsoleApp390\bin\Debug\ConsoleApp390.exe";
            Process proc=Process.Start(net48Name);
            proc.WaitForExit();
        }
        static void TestCore30Demo()
        {
            for (int i = 0; i < 10; i++)
            {
                if (!IsBusy)
                {
                    Console.WriteLine($"Test Core30Demo() {i}");
                    IsBusy = true;
                    Thread thread = new Thread(() =>
                    {
                        Core30Demo();
                    });
                    thread.Start();
                    thread.Join();
                    while (thread.ThreadState != System.Threading.ThreadState.Stopped)
                    { }

                    if (thread.ThreadState == System.Threading.ThreadState.Stopped)
                    {
                        IsBusy = false;
                    }
                }
            }
        }

        static void Core30Demo()
        {
            string core30Name = @"D:\C\ConsoleApp389\bin\Debug\netcoreapp3.0\ConsoleApp389.exe";
            Process proc=Process.Start(core30Name);
            proc.WaitForExit();
        }
    }
}
复制代码

 

 

 I'll list serveral executed results.

In .net NewtonJson is faster than  System.Text.Json.JsonSerializer.Serialize.The  validated result as below.

1.

NewtonJsonDemo cost 1290 milliseconds.
JsonSerializerDemo cost 1404 milliseconds.

 2.

NewtonJsonDemo cost 1213 milliseconds.
JsonSerializerDemo cost 1814 milliseconds.

3.

NewtonJsonDemo cost 1305 milliseconds.
JsonSerializerDemo cost 1373 milliseconds.

4.

NewtonJsonDemo cost 1329 milliseconds.
JsonSerializerDemo cost 1749 milliseconds.

5.

NewtonJsonDemo cost 1234 milliseconds.
JsonSerializerDemo cost 1395 milliseconds.

While  in .net core 3.0 System.Text.Json.JsonSerializer.Serialize is faster than NewtonJson.

1.

NewtonJsonDemo cost 1704 milliseconds.
JsonSerializerDemo cost 1247 milliseconds.

2.

NewtonJsonDemo cost 1596 milliseconds.
JsonSerializerDemo cost 1451 milliseconds.

3.

NewtonJsonDemo cost 1430 milliseconds.
JsonSerializerDemo cost 1221 milliseconds.

4.

NewtonJsonDemo cost 1390 milliseconds.
JsonSerializerDemo cost 1219 milliseconds.

5.

NewtonJsonDemo cost 1334 milliseconds.
JsonSerializerDemo cost 1216 milliseconds.

 

Totally speaking, the .net core is completely faster than .net both in NewtonJson and System.Text.Json.JsonSerializer.Serialize

The data source come from Adventureworks2017.Sales.SalesOrderDetail table which has 121317 rows .

 

 

复制代码
In  .net 4.8,now 201911221845464103 NewtonJsonDemo cost 1147 milliseconds.JsonSerializerDemo cost 1352 milliseconds.

In  .net 4.8,now 201911221845548941 NewtonJsonDemo cost 1082 milliseconds.JsonSerializerDemo cost 1263 milliseconds.

In  .net 4.8,now 201911221846033311 NewtonJsonDemo cost 1143 milliseconds.JsonSerializerDemo cost 1245 milliseconds.

In  .net 4.8,now 201911221846149554 NewtonJsonDemo cost 1109 milliseconds.JsonSerializerDemo cost 1210 milliseconds.

In  .net 4.8,now 201911221846233923 NewtonJsonDemo cost 1110 milliseconds.JsonSerializerDemo cost 1299 milliseconds.

In  .net 4.8,now 201911221846318762 NewtonJsonDemo cost 1140 milliseconds.JsonSerializerDemo cost 1253 milliseconds.

In  .net 4.8,now 201911221846403287 NewtonJsonDemo cost 1125 milliseconds.JsonSerializerDemo cost 1192 milliseconds.

In  .net 4.8,now 201911221846487188 NewtonJsonDemo cost 1215 milliseconds.JsonSerializerDemo cost 1219 milliseconds.

In  .net 4.8,now 201911221846569683 NewtonJsonDemo cost 1126 milliseconds.JsonSerializerDemo cost 1306 milliseconds.

In  .net 4.8,now 201911221847057021 NewtonJsonDemo cost 1121 milliseconds.JsonSerializerDemo cost 1322 milliseconds.

In .core 3.0,now 201911221847194044 NewtonJsonDemo cost 1172 milliseconds.JsonSerializerDemo cost 999 milliseconds.

In .core 3.0,now 201911221847269311 NewtonJsonDemo cost 1133 milliseconds.JsonSerializerDemo cost 1069 milliseconds.

In .core 3.0,now 201911221847343703 NewtonJsonDemo cost 1043 milliseconds.JsonSerializerDemo cost 941 milliseconds.

In .core 3.0,now 201911221847418622 NewtonJsonDemo cost 1098 milliseconds.JsonSerializerDemo cost 919 milliseconds.

In .core 3.0,now 201911221847492909 NewtonJsonDemo cost 1072 milliseconds.JsonSerializerDemo cost 1025 milliseconds.

In .core 3.0,now 201911221847567419 NewtonJsonDemo cost 1073 milliseconds.JsonSerializerDemo cost 1063 milliseconds.

In .core 3.0,now 201911221848041989 NewtonJsonDemo cost 1059 milliseconds.JsonSerializerDemo cost 1002 milliseconds.

In .core 3.0,now 201911221848125705 NewtonJsonDemo cost 1112 milliseconds.JsonSerializerDemo cost 880 milliseconds.

In .core 3.0,now 201911221848242935 NewtonJsonDemo cost 1116 milliseconds.JsonSerializerDemo cost 884 milliseconds.

In .core 3.0,now 201911221848318144 NewtonJsonDemo cost 1089 milliseconds.JsonSerializerDemo cost 991 milliseconds.
复制代码

 

posted @   FredGrit  阅读(401)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示