上一篇文章中我已经介绍了JsonBuilder方案的整体思路以及一个版本的雏形代码,他现在已经是可以使用的了,但是因为是实时反射的,所以效率并不高。

鉴于几位博友对Json转换组件的性能有兴趣,我先放几个常用组件的测试结果以供参考。下一篇在详细介绍JsonBuilder的优化工作

  测试用例

  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. /// <summary> 用户对象
  5. /// </summary>
  6. public class User
  7. {
  8. public static User TestUser()
  9. {//这里我尽量构造一个看上去很复杂的对象,并且这个对象几乎涵盖了所有常用的类型
  10. User user = new User();
  11. user.UID = Guid.NewGuid();
  12. user.Birthday = new DateTime(, , , , , );
  13. user.IsDeleted = false;
  14. user.Name = "blqw";
  15. user.Sex = UserSex.Male;
  16. user.LoginHistory = new List<DateTime>();
  17. user.LoginHistory.Add(DateTime.Today.Add(new TimeSpan(, , )));
  18. user.LoginHistory.Add(DateTime.Today.Add(new TimeSpan(, , )));
  19. user.LoginHistory.Add(DateTime.Today.Add(new TimeSpan(, , )));
  20. user.LoginHistory.Add(DateTime.Today.Add(new TimeSpan(, , )));
  21. user.LoginHistory.Add(DateTime.Today.Add(new TimeSpan(, , )));
  22. user.Info = new UserInfo();
  23. user.Info.Address = "广东省广州市";
  24. user.Info.ZipCode = ;
  25. user.Info.Phone = new Dictionary<string, string>();
  26. user.Info.Phone.Add("手机", "");
  27. user.Info.Phone.Add("电话", "");
  28. user.Info.Phone.Add("短号", "");
  29. user.Info.Phone.Add("QQ", "");
  30. user.Double = Double.NegativeInfinity;
  31. // user.Self = user; //这里是用来测试循环引用的解析情况
  32. return user;
  33. }
  34.  
  35. public User Self { get; set; }
  36. //User self
  37. /// <summary> 唯一ID
  38. /// </summary>
  39. public Guid UID { get; set; }
  40. /// <summary> 用户名称
  41. /// </summary>
  42. public string Name { get; set; }
  43. /// <summary> 生日
  44. /// </summary>
  45. public DateTime Birthday { get; set; }
  46. /// <summary> 性别
  47. /// </summary>
  48. public UserSex Sex { get; set; }
  49. /// <summary> 是否删除标记
  50. /// </summary>
  51. public bool IsDeleted { get; set; }
  52. /// <summary> 最近登录记录
  53. /// </summary>
  54. public List<DateTime> LoginHistory { get; set; }
  55. /// <summary> 联系信息
  56. /// </summary>
  57. public UserInfo Info { get; set; }
  58. public Double Double { get; set; }
  59. }
  60. /// <summary> 用户性别
  61. /// </summary>
  62. public enum UserSex
  63. {
  64. /// <summary> 男
  65. /// </summary>
  66. Male,
  67. /// <summary> 女
  68. /// </summary>
  69. Female
  70. }
  71. /// <summary> 用户信息
  72. /// </summary>
  73. public class UserInfo
  74. {
  75. /// <summary> 地址
  76. /// </summary>
  77. public string Address { get; set; }
  78. /// <summary> 联系方式
  79. /// </summary>
  80. public Dictionary<string, string> Phone { get; set; }
  81. /// <summary> 邮政编码
  82. /// </summary>
  83. public int ZipCode { get; set; }
  84. }

测试用例

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Diagnostics;
  5. using System.Reflection.Emit;
  6. using System.Data;
  7. using fastJSON;
  8. using System.IO;
  9. using System.Threading;
  10.  
  11. namespace blqw
  12. {
  13. class Program
  14. {
  15.  
  16. static void Main(string[] args)
  17. {
  18. int count = ;
  19. var obj = User.TestUser();
  20. TestJavaScriptSerializer(count, obj);
  21. TestNewtonsoftJson(count, obj);
  22. TestJayrockJson(count, obj);
  23. TestFastJson(count, obj);
  24. TestQuickJsonBuilder(count, obj);
  25. TestJsonBuilder(count, obj);
  26. }
  27.  
  28. //测试QuickJsonBuilder性能
  29. static void TestQuickJsonBuilder(int count, object obj)
  30. {
  31. Stopwatch sw = new Stopwatch();
  32.  
  33. Console.WriteLine();
  34. Console.WriteLine("QuickJsonBuilder 每次" + count + " 共10次");
  35. for (int j = ; j < ; j++)
  36. {
  37. sw.Restart();
  38. for (int i = ; i < count; i++)
  39. {
  40. QuickJsonBuilder jb = new QuickJsonBuilder();
  41. jb.ToJson(obj);
  42. }
  43. sw.Stop();
  44. Console.Write(sw.ElapsedMilliseconds + "ms | ");
  45. }
  46. Console.WriteLine();
  47. Console.WriteLine("结果:" + new QuickJsonBuilder().ToJson(obj));
  48. Console.WriteLine("==============================================");
  49. }
  50. //测试FastJson性能
  51. static void TestFastJson(int count, object obj)
  52. {
  53. Stopwatch sw = new Stopwatch();
  54. JSONParameters p = new JSONParameters();
  55. p.EnableAnonymousTypes
  56. = p.IgnoreCaseOnDeserialize
  57. = p.ShowReadOnlyProperties
  58. = p.UseEscapedUnicode
  59. = p.UseExtensions
  60. = p.UseFastGuid
  61. = p.UseOptimizedDatasetSchema
  62. = p.UseUTCDateTime
  63. = p.UsingGlobalTypes
  64. = false;
  65. Console.WriteLine();
  66. Console.WriteLine("fastJSON.NET 每次" + count + " 共10次");
  67. for (int j = ; j < ; j++)
  68. {
  69. sw.Restart();
  70. for (int i = ; i < count; i++)
  71. {
  72. fastJSON.JSON.Instance.ToJSON(obj, p);
  73. }
  74. sw.Stop();
  75. Console.Write(sw.ElapsedMilliseconds + "ms | ");
  76. }
  77.  
  78. Console.WriteLine();
  79. Console.WriteLine("结果:" + fastJSON.JSON.Instance.ToJSON(obj, p));
  80. Console.WriteLine("==============================================");
  81. }
  82. //测试JayrockJson性能
  83. static void TestJayrockJson(int count, object obj)
  84. {
  85. Stopwatch sw = new Stopwatch();
  86.  
  87. Console.WriteLine();
  88. Console.WriteLine("Jayrock.Json 每次" + count + " 共10次");
  89. for (int j = ; j < ; j++)
  90. {
  91. sw.Restart();
  92. for (int i = ; i < count; i++)
  93. {
  94. var writer = new Jayrock.Json.JsonTextWriter();
  95. Jayrock.Json.Conversion.JsonConvert.Export(obj, writer);
  96. string str = writer.ToString();
  97. }
  98. sw.Stop();
  99. Console.Write(sw.ElapsedMilliseconds + "ms | ");
  100. }
  101. var w = new Jayrock.Json.JsonTextWriter();
  102. Jayrock.Json.Conversion.JsonConvert.Export(obj, w);
  103.  
  104. Console.WriteLine();
  105. Console.WriteLine("结果:" + w.ToString());
  106. Console.WriteLine("==============================================");
  107. }
  108.  
  109. static void TestNewtonsoftJson(int count, object obj)
  110. {
  111. Stopwatch sw = new Stopwatch();
  112.  
  113. Console.WriteLine();
  114. Console.WriteLine("Newtonsoft.Json 每次" + count + " 共10次");
  115. for (int j = ; j < ; j++)
  116. {
  117. sw.Restart();
  118. for (int i = ; i < count; i++)
  119. {
  120. Newtonsoft.Json.JsonConvert.SerializeObject(obj);
  121. }
  122. sw.Stop();
  123. Console.Write(sw.ElapsedMilliseconds + "ms | ");
  124. }
  125. var w = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
  126.  
  127. Console.WriteLine();
  128. Console.WriteLine("结果:" + w.ToString());
  129. Console.WriteLine("==============================================");
  130. }
  131.  
  132. static void TestJavaScriptSerializer(int count, object obj)
  133. {
  134.  
  135. Stopwatch sw = new Stopwatch();
  136.  
  137. Console.WriteLine();
  138. Console.WriteLine("JavaScriptSerializer 每次" + count + " 共10次");
  139. for (int j = ; j < ; j++)
  140. {
  141. sw.Restart();
  142. for (int i = ; i < count; i++)
  143. {
  144. new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(obj);
  145. }
  146. sw.Stop();
  147. Console.Write(sw.ElapsedMilliseconds + "ms | ");
  148. }
  149. var w = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(obj);
  150.  
  151. Console.WriteLine();
  152. Console.WriteLine("结果:" + w.ToString());
  153. Console.WriteLine("==============================================");
  154. }
  155.  
  156. //测试JsonBuilder性能
  157. static void JsonBuilder(int count, object obj)
  158. {
  159. Stopwatch sw = new Stopwatch();
  160.  
  161. Console.WriteLine();
  162. Console.WriteLine("QuickJsonBuilder 每次" + count + " 共10次");
  163. for (int j = ; j < ; j++)
  164. {
  165. sw.Reset();
  166. sw.Start();
  167. for (int i = ; i < count; i++)
  168. {
  169. JsonBuilder jb = new JsonBuilder();
  170. jb.ToJsonString(obj);
  171. }
  172. sw.Stop();
  173. Console.Write(sw.ElapsedMilliseconds + "ms | ");
  174. }
  175. Console.WriteLine();
  176. Console.WriteLine("结果:" + new JsonBuilder().ToJsonString(obj));
  177. Console.WriteLine("==============================================");
  178. }
  179.  
  180. }
  181. }

测试代码

  测试方案1:微软自带的的 JavaScriptSerializer

引用组件:System.Web.Extensions(微软自带了,引用下就好)

  1. string str = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(User.TestUser());
  2. //{"Self":null,"UID":"6f50b429-5c13-4875-a29a-e4bd8d7b2772","Name":"blqw","Birthday":"\/Date(530964000000)\/","Sex":0,"IsDeleted":false,"LoginHistory":["\/Date(1377129600000)\/","\/Date(1377137410000)\/","\/Date(1377146036000)\/","\/Date(1377163518000)\/","\/Date(1377184019000)\/"],"Info":{"Address":"广东省广州市","Phone":{"手机":"18688888888","电话":"82580000","短号":"10086","QQ":"21979018"},"ZipCode":510000},"Double":-Infinity}

  测试方案2:Newtonsoft.Json

引用组件:Newtonsoft.Json.Net35.dll

  1. string str = Newtonsoft.Json.JsonConvert.SerializeObject(User.TestUser());
  2. //{"Self":null,"UID":"6f50b429-5c13-4875-a29a-e4bd8d7b2772","Name":"blqw","Birthday":"\/Date(530964000000+0800)\/","Sex":0,"IsDeleted":false,"LoginHistory":["\/Date(1377129600000+0800)\/","\/Date(1377137410000+0800)\/","\/Date(1377146036000+0800)\/","\/Date(1377163518000+0800)\/","\/Date(1377184019000+0800)\/"],"Info":{"Address":"广东省广州市","Phone":{"手机":"18688888888","电话":"82580000","短号":"10086","QQ":"21979018"},"ZipCode":510000},"Double":-Infinity}

  测试方案3:Jayrock.Json

引用组件:Jayrock.Json.dll

  1. JsonTextWriter jtw = new Jayrock.Json.JsonTextWriter();
  2. Jayrock.Json.Conversion.JsonConvert.Export(User.TestUser(), jtw);
  3. string str = jtw.ToString();
  4. //{"uID":"6f50b429-5c13-4875-a29a-e4bd8d7b2772","name":"blqw","birthday":"1986-10-29T18:00:00.0000000+08:00","sex":"Male","isDeleted":false,"loginHistory":["2013-08-22T08:00:00.0000000+08:00","2013-08-22T10:10:10.0000000+08:00","2013-08-22T12:33:56.0000000+08:00","2013-08-22T17:25:18.0000000+08:00","2013-08-22T23:06:59.0000000+08:00"],"info":{"address":"广东省广州市","phone":{"手机":"18688888888","电话":"82580000","短号":"10086","QQ":"21979018"},"zipCode":510000},"double":-Infinity}

  测试方案4:fastJSON.NET

引用组件:fastJSON.dll

  1. JSONParameters p = new JSONParameters();
  2. p.EnableAnonymousTypes
  3. = p.IgnoreCaseOnDeserialize
  4. = p.ShowReadOnlyProperties
  5. = p.UseEscapedUnicode
  6. = p.UseExtensions
  7. = p.UseFastGuid
  8. = p.UseOptimizedDatasetSchema
  9. = p.UseUTCDateTime
  10. = p.UsingGlobalTypes
  11. = false;//所有参数为false,执行速度最快
  12.  
  13. string str = fastJSON.JSON.Instance.ToJSON(User.TestUser(), p);
  14. //{"Self":null,"UID":"6f50b429-5c13-4875-a29a-e4bd8d7b2772","Name":"blqw","Birthday":"1986-10-29 18:00:00","Sex":"Male","IsDeleted":false,"LoginHistory":["2013-08-22 08:00:00","2013-08-22 10:10:10","2013-08-22 12:33:56","2013-08-22 17:25:18","2013-08-22 23:06:59"],"Info":{"Address":"广东省广州市","Phone":{"手机":"18688888888","电话":"82580000","短号":"10086","QQ":"21979018"},"ZipCode":510000},"Double":-Infinity}

  测试方案5,6:QuickJsonBuilder,JsonBuilder

ps:以上几种类型都不支持循环引用,如果有,直接抛出异常

说明:QuickJsonBuilder就是我上篇中介绍的JsonBuilder的终极形态

  1. QuickJsonBuilder jb = new QuickJsonBuilder();
  2. jb.ToJson(User.TestUser());
    //{"Self":null,"UID":"6f50b429-5c13-4875-a29a-e4bd8d7b2772","Name":"blqw","Birthday":"1986-10-29 18:00:00","Sex":"Male","IsDeleted":false,"LoginHistory":["2013-08-22 08:00:00","2013-08-22 10:10:10","2013-08-22 12:33:56","2013-08-22 17:25:18","2013-08-22 23:06:59"],"Info":{"Address":"广东省广州市","Phone":{"手机":"18688888888","电话":"82580000","短号":"10086","QQ":"21979018"},"ZipCode":510000},"Double":-Infinity}

ps:当Self指向自己本身的时候,将返回 "Self":undefined 用以区分空对象

  测试方案7:ServiceStack.Text

引用组件:ServiceStack.Text.dll 抱歉我只找到4.0的

这个是后来补上的,测试代码中没有这个...

  1. User.TestUser().ToJson();
  2. //{"UID":"48d4624ad0c8475094d00fc769c7129f","Name":"blqw","Birthday":"\/Date(530964000000+0800)\/","Sex":"Male","IsDeleted":false,"LoginHistory":["\/Date(1377129600000+0800)\/","\/Date(1377137410000+0800)\/","\/Date(1377146036000+0800)\/","\/Date(1377163518000+0800)\/","\/Date(1377184019000+0800)\/"],"Info":{"Address":"广东省广州市","Phone":{"手机":"18688888888","电话":"82580000","短号":"10086","QQ":"21979018"},"ZipCode":510000},"Double":-Infinity}

ps:依然不支持循环引用,抛出堆栈异常

  测试结果(单位 "毫秒")

 
循环次数 测试组件 第一轮 第二轮 第三轮 第四轮 第五轮
1次  JavaScriptSerializer    0  0  0  0
 Newtonsoft.Json    0  0  0  0
 Jayrock.Json  85  0  0  0  0
 fastJSON.NET  47  0  0  0  0
 QuickJsonBuilder  37  0  0  0  0
 JsonBuilder  22  0  0  0  0
ServiceStack.Text  138  0  0  0  0
100次  JavaScriptSerializer    7  7  8  7
 Newtonsoft.Json    2  3  2  2
 Jayrock.Json  77  8  9  9  8
 fastJSON.NET  41  1  1  1  1
 QuickJsonBuilder  36  1  1  1  1
 JsonBuilder  26  3  4  3  3
ServiceStack.Text  139  2  2  2  2
10000次  JavaScriptSerializer  765  751  752  751  749
 Newtonsoft.Json  437  253  251  248  243
 Jayrock.Json  967  905  965  913  952
 fastJSON.NET  239  181  200  167  166
 QuickJsonBuilder  171  128  132  136  129
 JsonBuilder  418  386  388  391  360
ServiceStack.Text  367  216  224  238  223

测试结果仅供参考

  总结

可以看出基本所有组件在第一轮用时都是最长的,应该是在处理一些初始化和缓存的工作。

所以呢,我特别给出了1次的循环结果,

JavaScriptSerializer 可以看出在100次以内的时候微软的还是有一些优势的,随着次数增加性能就渐渐跟不上了

Newtonsoft.Json一直表现平平啊,没有特别突出就地方,就跟JsonBuilder比性能也没有好到那里去

Jayrock.Json 是昨天一位博友告诉我的,据说是淘宝sdk在用的,性能只能说,好差。。。

fastJSON.NET 确实是所有组件中最快的,QuickJsonBuilder也从中借鉴了一些处理方式

ServiceStack.Text 中规中矩吧比Newtonsoft.Json好一点点.就是我只找到4.0的拓展方法,不知道2.0下有没有相应的组件

好吧 我自己的组件我就不做评价了

几个常用Json组件的性能测试的更多相关文章

  1. Java几种常用JSON库性能比较

    本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能. 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库.但是百闻不如一见,只有自己亲手测试过的才是最值得相信的. JSON ...

  2. 【转载】 C#使用Newtonsoft.Json组件来反序列化字符串为对象

    在Asp.Net网站开发的过程中,很多时候会遇到对象的序列化和反序列化操作,Newtonsoft.Json组件是专门用来序列化和反序列化操作的一个功能组件,引入这个DLL组件后,就可使用JsonCon ...

  3. 统一的Json组件和csv下载组件

    java-web-common java-web-common Json组件 目标和用途 规范Json接口格式 Controller中一律返回Java object,组件将自动转换数据格式,满足Jso ...

  4. java后台常用json解析工具问题小结

    若排版紊乱可查看我的个人博客原文地址 java后台常用json解析工具问题小结 这里不细究造成这些问题的底层原因,只是单纯的描述我碰到的问题及对应的解决方法 jackson将java对象转json字符 ...

  5. [转]MySQL常用Json函数和MySQL常用字符串函数

    MySQL常用Json函数:https://www.cnblogs.com/waterystone/p/5626098.html MySQL常用字符串函数:https://www.cnblogs.co ...

  6. React Native常用第三方组件汇总--史上最全 之一

    React Native 项目常用第三方组件汇总: react-native-animatable 动画 react-native-carousel 轮播 react-native-countdown ...

  7. Java常用排序算法及性能测试集合

    测试报告: Array length: 20000 bubbleSort : 573 ms bubbleSortAdvanced : 596 ms bubbleSortAdvanced2 : 583 ...

  8. React Native常用第三方组件汇总--史上最全[转]

    本文出处: http://blog.csdn.net/chichengjunma/article/details/52920137 React Native 项目常用第三方组件汇总: react-na ...

  9. 常用json解析库比较及选择 fastjson & gson

    一.常用json解析库比较及选择 1.简介 fastjson和gson是目前比较常用的json解析库,并且现在我们项目代码中,也在使用这两个解析库. fastjson 是由阿里开发的,号称是处理jso ...

随机推荐

  1. 虚拟机主机能互相ping通,但是无法远程连接

    首先将虚拟机关机,找到Edit virtual machine Settings(编辑虚拟机设置)

  2. 小规模的流处理框架.Part 1: thread pools

    原文链接:http://ifeve.com/part-1-thread-pools/ 很不错的一篇文章

  3. 标准io与文件io

    A: 代码重复: 语句块1: while(判断) { 语句块2: 语句块1: } 上面可以改写为: while(1) { 语句块1: if(判断) break: 语句块2: } B: 标准IO和文件I ...

  4. Javascript原型继承 __proto__

    Javascript继承是通过原型链继承的 原型链是依赖__proto__而不是prototype var animal = function(){}; var dog = function(){}; ...

  5. selenium使用笔记(一)

    有时候在交流群里经常会看到这样的问题,selenium能进行性能测试吗?selenium1和selenium2有什么区别等等问题,在这里谈一下自己学习和工作以后对selenium的认识.我所记录的东西 ...

  6. 《DSP using MATLAB》示例Example5.21

  7. javaweb学习笔记之servlet01

    一.Servlet概述 A servlet is a small Java program that runs within a Web server. Servlets receive and re ...

  8. Python3使用urllib访问网页

    介绍 改教程翻译自python官网的一篇文档. urllib.request是一个用于访问URL(统一资源定位符)的Python模块.它以urlopen函数的形式提供了一个非常简单的接口,可以访问使用 ...

  9. python 引用传递与值传递

    https://taizilongxu.gitbooks.io/stackoverflow-about-python/content/16/README.html 1.也就是如果传可变对象,就是引用传 ...

  10. Eclipse 执行成功的 Hadoop-1.2.1 WordCount 源码

    万事开头难.最近在学习Hadoop,先是搭建各种版本环境,从2.2.0到2.3.0,再到1.2.1,终于都搭起来了,折腾了1周时间,之后开始尝试使用Eclipse编写小demo.仅复制一个现成的Wor ...