前一段时间逛园子的时候发现有人比较了Jil、Json.NET和Protobuf的性能,一时好奇,也做了个测试,这里记录下来,以供查阅。
前期准备
依赖类库的话,可以通过Nuget在公共组件库总下载,这里不做赘述。我在数据库中生成了一些PostInfo数据,取100条进行测试:
[ProtoContract] public class PostInfo { [ProtoMember(1)] public long P_ID { get; set; } [ProtoMember(2)] public string P_Title { get; set; } [ProtoMember(3)] public string P_Content { get; set; } [ProtoMember(4)] public string P_CreateTime { get; set; } }
Jil
Jil是一款高性能的Json序列化工具,大名鼎鼎的StackOverflow也在用它,不少园友说他的性能比Json.NET更快,由于我本身机器环境的原因未能使用最新版,这里使用的是2.6.0版本。
//序列化 JSON.Serialize<List<PostInfo>>(infos); //反序列化 JSON.Deserialize<List<PostInfo>>(jilSerialize);
Json.NET
Json.NET(Newtonsoft.Json)也是一款常用的Json序列化工具,我现在的公司就在使用它,这里使用版本是9.0.1。
//序列化 JsonConvert.SerializeObject(infos); //反序列化 JsonConvert.DeserializeObject<List<PostInfo>>(newtonSerialize);
Protobuf-NET
Protobuf是谷歌出品的数据序列化工具,优点是体积小速度快,但是它并不支持.NET,目前使用的是Java的移植版,而且它的数据格式不能被JS解析,个人认为不太适合作为公共的数据传输规范,目前使用的版本是2.0.0.668,使用起来也比前面两个麻烦,如PostInfo中还要加上ProtoContract和ProtoMember特性。这里顺便提一下,在我使用的过程中发现数据量过大或者使用UTF-8格式对数据进行操作时,Protobuf均会报出异常,可能是我本人使用的问题,也可能是新版本中已经解决的这个问题。
//序列化 using (MemoryStream ms = new MemoryStream()) { Serializer.Serialize<List<PostInfo>>(ms, infos); protoSerialize = Encoding.Unicode.GetString(ms.ToArray()); } //反序列化 using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(protoSerialize))) { var protobuf_infos = Serializer.Deserialize<List<PostInfo>>(ms); }
执行结果
序列化时间比较:Protobuf(39ms)>Json.NET(84ms)>Jil(168ms)
反序列化时间比较:Protobuf(6ms)>Json.NET(24ms)>Jil(58ms)
通过执行结果可以看到Protobuf果然是一骑千里绝尘去,甩了其他工具好几条街,可以考虑一下用它来传输和存储日志信息,但Josn.NET的性能和Jil的性能并不如园友们测试的那样Jil的性能要高于Json.NET,我尝试将数据量增加,结果依旧如此,预估有可能跟我引用的版本存在一些关系,但因为环境所限,我也就不折腾了,好了就到这里了。