[C# 문법] XML, JSON, MessagePack 직렬화, 역직렬화 성능 측정(벤치마크)

XML, JSON, MessagePack 벤치마크 성능 비교

  • XML, JSON, MessagePack 각각 직렬화, 역직렬화 테스트 코드를 작성하고 벤치마크 성능 비교를 진행하였습니다.
  • 벤치마크 성능 체크는 BenchMarkDotNet 누겟을 이용하였습니다.
  • 벤치마크는 각각 1번, 100번, 10000번 반복하여 성능 체크하였습니다.

XML, JSON, MessagePack 직렬화 벤치마크 예제 코드

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using MessagePack;
using System;
using System.IO;
using System.Text;
using System.Text.Json;
using System.Xml.Serialization;

namespace BenchMarkTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var summary = BenchmarkRunner.Run<SerializeBenchMarkTest>();
        }
    }

    [Serializable]
    public class ConfigXML
    {
        public string IP;
        public string PW;
        public string SID;
    }

    [MessagePackObject]
    public class ConfigMessagePack
    {
        [Key("IP")]
        public string IP { get; set; }
        [Key("PW")]
        public string PW { get; set; }
        [Key("SID")]
        public string SID { get; set; }
    }

    public class ConfigJSON
    {
        public string IP { get; set; }
        public string PW { get; set; }
        public string SID { get; set; }
    }

    [MemoryDiagnoser]
    public class SerializeBenchMarkTest
    {
        [Params(1, 100, 10000)]
        public int Iterations { get; set; }

        public ConfigXML CreateXML()
        {
            ConfigXML myConfig = new ConfigXML()
            {
                IP = "127.0.0.1",
                PW = "asdf1234",
                SID = "DatabaseSID"
            };

            return myConfig;
        }

        public ConfigMessagePack CreateMessagePack()
        {
            ConfigMessagePack myConfig = new ConfigMessagePack()
            {
                IP = "127.0.0.1",
                PW = "asdf1234",
                SID = "DatabaseSID"
            };

            return myConfig;
        }

        public ConfigJSON CreateJSON()
        {
            ConfigJSON myConfig = new ConfigJSON()
            {
                IP = "127.0.0.1",
                PW = "asdf1234",
                SID = "DatabaseSID"
            };

            return myConfig;
        }

        public void SerializerXML(int iterations)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(ConfigXML));
            ConfigXML myConfig = CreateXML();

            for (int index = 0; index < iterations; index++)
            {
                using (MemoryStream xmlStream = new MemoryStream())
                {
                    xmlSerializer.Serialize(xmlStream, myConfig);
                }
            }
        }

        public void SerializerMessagePack(int iterations)
        {
            ConfigMessagePack myConfig = CreateMessagePack();

            for (int index = 0; index < iterations; index++)
            {
                // 직렬화, 반환값은 바이트 배열
                var binConfig = MessagePackSerializer.Serialize(myConfig);
            }
        }

        public void SerializerJSON(int iterations)
        {
            ConfigJSON config = CreateJSON();
            for (int index = 0; index < iterations; index++)
            {
                var jsonString = JsonSerializer.Serialize(config);
            }
        }

        [Benchmark]
        public void SerializeXMLTest()
        {
            SerializerXML(Iterations);
        }

        [Benchmark]
        public void SerializeMessagePackTest()
        {
            SerializerMessagePack(Iterations);
        }

        [Benchmark]
        public void SerializeJsonTest()
        {
            SerializerJSON(Iterations);
        }
    }
}

직렬화 실행 결과



XML, JSON, MessagePack 역직렬화 벤치마크 예제 코드

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using MessagePack;
using System;
using System.IO;
using System.Text;
using System.Text.Json;
using System.Xml.Serialization;

namespace BenchMarkTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var summary = BenchmarkRunner.Run<SerializeBenchMarkTest>();
        }
    }

    [Serializable]
    public class ConfigXML
    {
        public string IP;
        public string PW;
        public string SID;
    }

    [MessagePackObject]
    public class ConfigMessagePack
    {
        [Key("IP")]
        public string IP { get; set; }
        [Key("PW")]
        public string PW { get; set; }
        [Key("SID")]
        public string SID { get; set; }
    }

    public class ConfigJSON
    {
        public string IP { get; set; }
        public string PW { get; set; }
        public string SID { get; set; }
    }

    [MemoryDiagnoser]
    public class SerializeBenchMarkTest
    {
        [Params(1, 100, 10000)]
        public int Iterations { get; set; }

        public ConfigXML CreateXML()
        {
            ConfigXML myConfig = new ConfigXML()
            {
                IP = "127.0.0.1",
                PW = "asdf1234",
                SID = "DatabaseSID"
            };

            return myConfig;
        }

        public ConfigMessagePack CreateMessagePack()
        {
            ConfigMessagePack myConfig = new ConfigMessagePack()
            {
                IP = "127.0.0.1",
                PW = "asdf1234",
                SID = "DatabaseSID"
            };

            return myConfig;
        }

        public ConfigJSON CreateJSON()
        {
            ConfigJSON myConfig = new ConfigJSON()
            {
                IP = "127.0.0.1",
                PW = "asdf1234",
                SID = "DatabaseSID"
            };

            return myConfig;
        }

        public void DeSerializerXML(string xmlConfig, int iterations)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(ConfigXML));

            for (int index = 0; index < iterations; index++)
            {
                using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xmlConfig)))
                {
                    stream.Position = 0;
                    ConfigXML testObj = ((ConfigXML)xmlSerializer.Deserialize(stream));
                }
            }
        }

        public void DeSerializerMessagePack(int iterations)
        {
            ConfigMessagePack myConfig = CreateMessagePack();

            // 직렬화, 반환값은 바이트 배열
            var binConfig = MessagePackSerializer.Serialize(myConfig);

            for (int index = 0; index < iterations; index++)
            {
                var binConfig2 = MessagePackSerializer.Deserialize<ConfigMessagePack>(binConfig);
            }
        }

        public void DeSerializerJSON(int iterations)
        {
            ConfigJSON config = CreateJSON();
            var jsonString = JsonSerializer.Serialize(config);

            for (int index = 0; index < iterations; index++)
            {
                var jsonValue = JsonSerializer.Deserialize<ConfigJSON>(jsonString);
            }
        }

        [Benchmark]
        public void DeSerializeXMLTest()
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(ConfigXML));
            string xmlConfig = string.Empty;
            ConfigXML myConfig = CreateXML();

            using (MemoryStream xmlStream = new MemoryStream())
            {
                xmlSerializer.Serialize(xmlStream, myConfig);
                xmlConfig = Encoding.UTF8.GetString(xmlStream.ToArray());
            }

            DeSerializerXML(xmlConfig, Iterations);
        }

        [Benchmark]
        public void DeSerializeMessagePackTest()
        {
            DeSerializerMessagePack(Iterations);
        }

        [Benchmark]
        public void DeSerializeJsonTest()
        {
            DeSerializerJSON(Iterations);
        }
    }
}

역직렬화 실행 결과


정리

  • 테스트 진행 결과 직렬화, 역직렬화 모두 MessagePack > Json > XML 순서로 결과가 나왔습니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY