之前一直用 LitJson 做Json序列化,主要用于Unity,修改下源码让其支持float类型后用起来也一直没有什么大问题,最近抽空在研究.net core的内容,发现在.net core开发环境下微软自带的Json库Newtonsoft.Json,用起来也很方便,而且支持Dictionary的字典类型的序列化,也不需要在指定的类上加[Serializable]的特性,而且可以自定义哪些字段可以被序列化,哪些被忽略,总之用起来很方便,然后就向用其替代LitJson,所以就先比较性能
LitJson测试代码
List<Person> lstPerson = new List<Person>();
Person onePerson = new Person() {
name = "loom",
nickname = "loom",
sex = 1,
age = 20,
idNum = "123456123456789876",
phoneNum = "13333333333",
emailNum = "13333333333@qq.com",
homeAddress = "china china china china china",
occupation = "main programer",
hobby = "music,running,coding"
};
for (int i = 0; i < 1000; i++)
{
lstPerson.Add(onePerson);
}
Stopwatch sw = new Stopwatch();
sw.Start();
string json = LitJson.JsonMapper.ToJson(lstPerson);
sw.Stop();
UnityEngine.Debug.Log("LitJson_1000耗时 : "+sw.Elapsed);
LitJson测试代码
List<Person> lstPerson = new List<Person>();
Person onePerson = new Person()
{
name = "loom",
nickname = "loom",
sex = 1,
age = 20,
idNum = "123456123456789876",
phoneNum = "13333333333",
emailNum = "13333333333@qq.com",
homeAddress = "china china china china china",
occupation = "main programer",
hobby = "music,running,coding"
};
for (int i = 0; i < 1000; i++)
{
lstPerson.Add(onePerson);
}
Stopwatch sw = new Stopwatch();
sw.Start();
string json = JsonConvert.SerializeObject(lstPerson);
sw.Stop();
UnityEngine.Debug.Log(sw.Elapsed);
100个元素测试结果,当然还跟类中有多少字段相关
1000个元素测试结果,当然还跟类中有多少字段相关
5000个元素测试结果,当然还跟类中有多少字段相关
10000个元素测试结果,当然还跟类中有多少字段相关
分析
通过上面的测试我们好像发现在5000个元素以下时,LitJson有明显的优势,5000个以上时Newtonsoft.Json开始有优势,但是,我发现在100和1000时其实他们的差别时不大的,那么可能的原因是什么呢,我在想是不是dll加载所导致的问题呢,那么我们对Newtonsoft.Json进行两次序列化,不考虑首次加载以第二次为准测试,再看一下
单个元素第一次第二次对比
100元素时第一次第二次对比
5000元素时第一次第二次对比
10000元素时第一次第二次对比
结论
通过以上的测试分析我们发现,Newtonsoft.Json除了在首次序列化时需要加载dll会导致序列化比较慢以外,在其他情况下,即当Newtonsoft.Json已经序列化一次后(即Newtonsoft.Json已经状态加载完成了),都是全部领先Litjson的,所以改用Newtonsoft.Json时完全没有问题的