一張圖吸引了我去測試MessagePack的效能
至於是不是真的這麼神 我們時間跑看看測試程式碼跟執行結果如下
Main:
public static void Main(string[] args) { MessagePackSerializer.SetDefaultResolver(MessagePack.Resolvers.ContractlessStandardResolver.Instance); var summary = BenchmarkRunner.RunMeasure:(); Console.Read(); }
using BenchmarkDotNet.Attributes; using MessagePack; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace SerializationPerformance { [MemoryDiagnoser] public class Measure { public readonly MyClass data; public byte[] bytes; public string Json_string; public Measure() { MessagePackSerializer.SetDefaultResolver(MessagePack.Resolvers.ContractlessStandardResolver.Instance); data = new MyClass { Age = 99, FirstName = "hoge", LastName = "huga", }; bytes = LZ4MessagePackSerializer.Serialize(data); Json_string = LZ4MessagePackSerializer.ToJson(bytes); } [Benchmark] public byte[] MessagePack_Serialize_Bytes() { byte[] result = MessagePackSerializer.Serialize(data); return result; } [Benchmark] public string MessagePack_Serialize_String() { byte[] result = MessagePackSerializer.Serialize(data); return MessagePackSerializer.ToJson(result); } [Benchmark] public MyClass MessagePack_Deserialize() { MyClass result = MessagePackSerializer.Deserialize可以看到我們較常用的object跟string之間的轉換速度上其實沒太大差異,如果單純只是二進制的轉換會快非常多 至於內存消耗可以看到MessagePack是優於json.Net不過型別的支援程度json.Net還是比較好用的 如果對於效能有要求這邊是滿推薦使用MessagePack只是在一些型別例如datetime jobject jarray等等格式就需要做另外formatter處理,就看個人的喜好決定了 轉為json字串也需要多打一串他的方法(LZ4MessagePackSerializer.FromJson(Json_string)); return result; } [Benchmark] public byte[] LZ4MessagePack_Serialize_Bytes() { var result = LZ4MessagePackSerializer.Serialize(data); return result; } [Benchmark] public string LZ4MessagePack_Serialize_String() { var result = LZ4MessagePackSerializer.Serialize(data); return MessagePackSerializer.ToJson(result); } [Benchmark] public MyClass LZ4MessagePack_Deserialize() { MyClass result = LZ4MessagePackSerializer.Deserialize (LZ4MessagePackSerializer.FromJson(Json_string)); return result; } [Benchmark] public string jsonNet_Serialize() { string result = JsonConvert.SerializeObject(data); return result; } [Benchmark] public MyClass jsonNet_Deserialize() { var result = JsonConvert.DeserializeObject (Json_string); return result; } } public class MyClass { public int Age { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string FullName { get { return FirstName + LastName; } } } }
沒有留言:
張貼留言