分享一个快速的Json(反)序列化开源项目 Jil

我们不缺少JSON的序列化库,但我们缺少一个性能非常好的库,这对于网站来说非常重要。今天我发现了Jil。

他是开源的代码: https://github.com/kevin-montrose/Jil

在他主页上有详细的介绍其性能的表现,我这里就不转述了,他最重要的特点就是性能,Emit那当然不会少了,当想让他超越其他的库光一个Emit肯定不行,他还有很多其他的优化。

  • 公共缓冲区

为介绍GC的压力,他使用了诸如builder.CommonCharBuffer这样的功能缓冲,builder.CommonStringBuffer也是这样的应用。

  • 内联

很多的方法,都标记了[MethodImpl(MethodImplOptions.AggressiveInlining)]以便编译器尽可能的内联。

  • 减少计算

比如将int转换为string,原先的代码是这样写的。

 1         [MethodImpl(MethodImplOptions.AggressiveInlining)]
 2         static void _CustomWriteInt(TextWriter writer, int number, char[] buffer)
 3         {
 4             // Gotta special case this, we can‘t negate it
 5             if (number == int.MinValue)
 6             {
 7                 writer.Write("-2147483648");
 8                 return;
 9             }
10
11             var ptr = InlineSerializer<object>.CharBufferSize - 1;
12
13             var copy = number;
14             if (copy < 0)
15             {
16                 copy = -copy;
17             }
18
19             do
20             {
21                 var ix = copy % 10;
22                 copy /= 10;
23
24                 buffer[ptr] = (char)(‘0‘ + ix);
25                 ptr--;
26             } while (copy != 0);
27
28             if (number < 0)
29             {
30                 buffer[ptr] = ‘-‘;
31                 ptr--;
32             }
33
34             writer.Write(buffer, ptr + 1, InlineSerializer<object>.CharBufferSize - 1 - ptr);
35         }

是不是觉得已经很好了,但是他们还不断进取,改成这样:

 1         [MethodImpl(MethodImplOptions.AggressiveInlining)]
 2         static void _CustomWriteInt(TextWriter writer, int number, char[] buffer)
 3         {
 4             var ptr = InlineSerializer<object>.CharBufferSize - 1;
 5
 6             uint copy;
 7             if (number >= 0)
 8                 copy = (uint)number;
 9             else
10             {
11                 writer.Write(‘-‘);
12                 copy = 1 + (uint)~number;
13             }
14
15             do
16             {
17                 var ix = copy % 100;
18                 copy /= 100;
19
20                 var chars = DigitPairs[ix];
21                 buffer[ptr--] = chars.Second;
22                 buffer[ptr--] = chars.First;
23             } while (copy != 0);
24
25             if (buffer[ptr + 1] == ‘0‘)
26                 ++ptr;
27
28             writer.Write(buffer, ptr + 1, InlineSerializer<object>.CharBufferSize - 1 - ptr);
29         }

其中,那个DigitPairs是什么呢?

 1 struct TwoDigits
 2         {
 3             public readonly char First;
 4             public readonly char Second;
 5
 6             public TwoDigits(char first, char second)
 7             {
 8                 First = first;
 9                 Second = second;
10             }
11         }
12
13         private static readonly TwoDigits[] DigitPairs;
14
15         static Methods()
16         {
17             DigitPairs = new TwoDigits[100];
18             for (var i=0; i < 100; ++i)
19                 DigitPairs[i] = new TwoDigits((char)(‘0‘ + (i / 10)), (char)+(‘0‘ + (i % 10)));
20         }

是不是想法很高呢?

  • 减少判断

原先的方法是这样的

 1 static bool IsWhiteSpace(int c)
 2         {
 3             // per http://www.ietf.org/rfc/rfc4627.txt
 4             // insignificant whitespace in JSON is defined as
 5             //  \u0020  - space
 6             //  \u0009  - tab
 7             //  \u000A  - new line
 8             //  \u000D  - carriage return
 9
10             return
11                 c == 0x20 ||
12                 c == 0x09 ||
13                 c == 0x0A ||
14                 c == 0x0D;
15         }

可以这样改,哈哈,其实我想这么改,不知道对不对?因为我觉得大多数情况下不是空白,所以一直要判断4次才能返回,而我改成这样:

 1 static bool IsWhiteSpace(int c)
 2         {
 3             // per http://www.ietf.org/rfc/rfc4627.txt
 4             // insignificant whitespace in JSON is defined as
 5             //  \u0020  - space
 6             //  \u0009  - tab
 7             //  \u000A  - new line
 8             //  \u000D  - carriage return
 9
10             return
11                 c < 0x21 && (
12                 c == 0x20 ||
13                 c == 0x09 ||
14                 c == 0x0A ||
15                 c == 0x0D);
16         }

分享一个快速的Json(反)序列化开源项目 Jil

时间: 2024-08-03 09:51:46

分享一个快速的Json(反)序列化开源项目 Jil的相关文章

分享一个简单易用的RPC开源项目—Tatala

http://zijan.iteye.com/blog/2041894 这个项目最早(2008年)是用于一个网络游戏的Cache Server,以及一个电子商务的Web Session服务.后来不断增加新的功能,除了Java还支持C#,到现在已经可以用它来开发网络游戏的服务器.等过些日子我还会开源网络游戏的服务器源码. 关于性能,当时后台相应请求的效率是每秒10W次,现在我在自己的笔记本上测,只有一个客户端与服务器都在一个物理机上(CPU: i7-3610QM; RAM: 8G; OS: Win

[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化

[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.NET中快带序列化和反序列化.最后介绍在使用.NET序列化JSON过程中的注意事项. 读前必备: A.泛型       [.net 面向对象编程基础]  (18) 泛型 B.LINQ使用  [.net 面向对象编程基础] (20) LINQ使用 1. 关于JSON JSON的全称是”JavaScrip

我来分享一个快速设置背景的js

我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> <div style="background: url(images/by_01.jpg) no-repeat top center;"></div> <div style="background: url(images/by_02.jpg) no

我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新

大家好,  我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain  用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 App Domain 中, 当 WebApp 的 Bin 目录 或者 Web.config 被更新时, 就会 创建一个 新的 App Domain, 我们把 这个 新的 App Domain 称之为  "New Domain", 把 原来的 正在运行的 App Domain 称之为  &qu

分享一个源码下载网站,天气预报项目源码,比较适合新手学习

本项目是一个天气预报项目源码,可以设置城市.可以更换应用内背景图片.自带天气widget小组件等,天气信息由m.weather.com.cn提供.比较适合新手学习和参考.项目编译版本4.2.2默认编码UTF-8源码有大量中文注释. 上链接:http://www.devstore.cn/code/info/104.html,需要的拿去. 天气预报项目相关服务--推送服务的选择,市场上的推送服务有百度云,个推,极光,友盟,小米,Bmob,智游等等,在如此多的推送服务里面你的项目该集合哪个推送服务呢,

[转]Android开源项目收藏分享

转自:http://blog.csdn.net/dianyueneo/article/details/40683285 Android开源项目分类汇总 如果你也对开源实现库的实现原理感兴趣,欢迎 Star 和 Fork 14884(入群理由必须填写群简介问题答案)4489 63224677(三群已满) 欢迎大家推荐好的Android开源项目,可直接Star.Fork :) 对你有帮助的话,顺手去知乎点个赞吧: 目前包括: ActionBar.ViewPager.GridView.Progress

Android 开源项目分类汇总

目前包括: Android 开源项目第一篇--个性化控件(View)篇  包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style.其他Android 开源项目第二篇--工具库篇  包括依赖注入.图片缓存.网络请求.数据库 ORM 工具包.Andro

Android常用酷炫控件(开源项目)github地址汇总

转载一个很牛逼的控件收集贴... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style 等等. 一.ListView android-pulltorefresh一个强大的拉动

Android 开源项目分类汇总(转)

## 第一部分 个性化控件(View)主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style 等等. #### 一.ListView1. android-pulltorefresh  一个强大的拉动刷新开源项目