分享一个快速的Json(反)序列化开源项目 Jil
我们不缺少JSON的序列化库,但我们缺少一个性能非常好的库,这对于网站来说非常重要。今天我发现了Jil。
他是开源的代码: https://github.com/kevin-montrose/Jil
在他主页上有详细的介绍其性能的表现,我这里就不转述了,他最重要的特点就是性能,Emit那当然不会少了,当想让他超越其他的库光一个Emit肯定不行,他还有很多其他的优化。
- 公共缓冲区
为介绍GC的压力,他使用了诸如builder.CommonCharBuffer这样的功能缓冲,builder.CommonStringBuffer也是这样的应用。
- 内联
很多的方法,都标记了[MethodImpl(MethodImplOptions.AggressiveInlining)]以便编译器尽可能的内联。
- 减少计算
比如将int转换为string,原先的代码是这样写的。
[MethodImpl(MethodImplOptions.AggressiveInlining)]
static void _CustomWriteInt(TextWriter writer, int number, char[] buffer)
{
// Gotta special case this, we can't negate it
if (number == int.MinValue)
{
writer.Write("-2147483648");
return;
} var ptr = InlineSerializer<object>.CharBufferSize - ; var copy = number;
if (copy < )
{
copy = -copy;
} do
{
var ix = copy % ;
copy /= ; buffer[ptr] = (char)('' + ix);
ptr--;
} while (copy != ); if (number < )
{
buffer[ptr] = '-';
ptr--;
} writer.Write(buffer, ptr + , InlineSerializer<object>.CharBufferSize - - ptr);
}
是不是觉得已经很好了,但是他们还不断进取,改成这样:
[MethodImpl(MethodImplOptions.AggressiveInlining)]
static void _CustomWriteInt(TextWriter writer, int number, char[] buffer)
{
var ptr = InlineSerializer<object>.CharBufferSize - ; uint copy;
if (number >= )
copy = (uint)number;
else
{
writer.Write('-');
copy = + (uint)~number;
} do
{
var ix = copy % ;
copy /= ; var chars = DigitPairs[ix];
buffer[ptr--] = chars.Second;
buffer[ptr--] = chars.First;
} while (copy != ); if (buffer[ptr + ] == '')
++ptr; writer.Write(buffer, ptr + , InlineSerializer<object>.CharBufferSize - - ptr);
}
其中,那个DigitPairs是什么呢?
struct TwoDigits
{
public readonly char First;
public readonly char Second; public TwoDigits(char first, char second)
{
First = first;
Second = second;
}
} private static readonly TwoDigits[] DigitPairs; static Methods()
{
DigitPairs = new TwoDigits[];
for (var i=; i < ; ++i)
DigitPairs[i] = new TwoDigits((char)('' + (i / )), (char)+('' + (i % )));
}
是不是想法很高呢?
- 减少判断
原先的方法是这样的
static bool IsWhiteSpace(int c)
{
// per http://www.ietf.org/rfc/rfc4627.txt
// insignificant whitespace in JSON is defined as
// \u0020 - space
// \u0009 - tab
// \u000A - new line
// \u000D - carriage return return
c == 0x20 ||
c == 0x09 ||
c == 0x0A ||
c == 0x0D;
}
可以这样改,哈哈,其实我想这么改,不知道对不对?因为我觉得大多数情况下不是空白,所以一直要判断4次才能返回,而我改成这样:
static bool IsWhiteSpace(int c)
{
// per http://www.ietf.org/rfc/rfc4627.txt
// insignificant whitespace in JSON is defined as
// \u0020 - space
// \u0009 - tab
// \u000A - new line
// \u000D - carriage return return
c < 0x21 && (
c == 0x20 ||
c == 0x09 ||
c == 0x0A ||
c == 0x0D);
}
分享一个快速的Json(反)序列化开源项目 Jil的更多相关文章
- 分享一个简单易用的RPC开源项目—Tatala
http://zijan.iteye.com/blog/2041894 这个项目最早(2008年)是用于一个网络游戏的Cache Server,以及一个电子商务的Web Session服务.后来不断增 ...
- [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...
- 分享一个快速设置背景的js 自动获取背景图的长宽
我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> ...
- 微人事 star 数超 10k,如何打造一个 star 数超 10k 的开源项目
看了下,微人事(https://github.com/lenve/vhr)项目 star 数超 10k 啦,松哥第一个 star 数过万的开源项目就这样诞生了. 两年前差不多就是现在这个时候,松哥所在 ...
- 我发起了一个 支持 ServerFul 架构 的 .Net 开源项目 ServerFulManager
大家好, 我发起了一个 支持 ServerFul 架构 的 .Net 开源项目 ServerFulManager . ServerFulManager 的 目标 是 实现一个 支持 ServerFu ...
- 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新
大家好, 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 A ...
- C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism
--概述 这个项目演示了如何在WPF中使用各种Prism功能的示例.如果您刚刚开始使用Prism,建议您从第一个示例开始,按顺序从列表中开始.每个示例都基于前一个示例的概念. 此项目平台框架:.NET ...
- 分享一个快速测试ios软件的工具
简易IPA安装地址生成器 地址: https://www.neicexia.com/IPADistribute/Resources/index.html?fromsite#IPADistribute- ...
- 分享一个快速审查js操作Dom的css
第一步 打开开发者工具第二步 打开 Sources 面板第三步 执行用户操作让对象可见(例如鼠标悬停)第四步 在元素可见的时候按下 F8(与“暂停脚本执行”按钮相同)第五步 点击开发者工具左上角的“选 ...
随机推荐
- [51NOD1095] Anigram单词(map)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1095 字典的单词在map中排序和不排序各存1次,查的时候相减. ...
- NSCalendar
1.获取当前时间的年月日时分秒 /* // 获取当前时间 NSDate *now = [NSDate date]; NSLog(@"now = %@", n ...
- MVC客户端验证配置
<appSettings> <add key="ClientValidationEnabled" value="true"/> < ...
- iOS - UIStoryboard
前言 NS_CLASS_AVAILABLE_IOS(5_0) @interface UIStoryboard : NSObject @available(iOS 5.0, *) public clas ...
- PHP基础知识之————PDO预处理语句
转载处:http://www.cnblogs.com/xiaohuochai/p/6133353.html 定义 在生成网页时,许多PHP脚本通常都会执行除参数之外,其他部分完全相同的查询语句,针对这 ...
- 批量创建客户主数据函数SD_CUSTOMER_MAINTAIN_ALL
分享一下批创建客户主数据函数:SD_CUSTOMER_MAINTAIN_ALL TABLES:T077D,ZCITY,T005S,BNKA,ADRC,KNA1. DATA: TMP_KTOKD(4) ...
- JS常用方法函数
document.write("");为 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,bod ...
- [html] Webp、Apng图片格式
WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式.图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间. 与JPEG相同,WebP是一种有损压缩.但谷 ...
- 在Spring Data JPA 中使用Update Query更新实体类
对于 Spring Data JPA 使用的时间不长,只有两年时间.但是踩过坑的却不少. 使用下列代码 @Modifying @Query("update User u set u.firs ...
- UEditor 之查询当前编辑区域的状态是源码模式还是可视化模式
在使用百度的编辑器的时候,遇到了这样的一个问题: 解决方法是 使用了两个命令: