[C# 문법] XML, JSON, MessagePack 직렬화, 역직렬화 성능 측정(벤치마크)
- C#/C# 문법
- 2021. 12. 16. 20:59
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
'C# > C# 문법' 카테고리의 다른 글
[C# 벤치마크] C# BenchMarkDotNet ParamsSource 사용법 (0) | 2021.12.17 |
---|---|
[C# 문법] Reflection 이용하여 Class 속성, 값 출력하기 (0) | 2021.12.16 |
[C# 문법] MessagePack ObservableCollection 직렬화, 역직렬화 (0) | 2021.12.16 |
[C# 문법] MessagePack 사용 방법 - 직렬화, 역직렬화 (0) | 2021.12.15 |
[C# 벤치마크] C# Json Serialize, DeSerialize 벤치마크 측정 (0) | 2021.12.15 |
이 글을 공유하기