分享一个快速的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(与“暂停脚本执行”按钮相同)第五步 点击开发者工具左上角的“选 ...
随机推荐
- SQL语句最基本的性能优化方法
有些人还不知道sql语句的基本性能优化方法,在此我简单提醒一下,最基本的优化方法: 1.检查是否缺少索引.调试的时候开启“包括实际的执行计划” 执行后会显示缺少的索引, 然后让dba帮助添 ...
- poj 2187 Beauty Contest (凸包暴力求最远点对+旋转卡壳)
链接:http://poj.org/problem?id=2187 Description Bessie, Farmer John's prize cow, has just won first pl ...
- java使用方法总结
第一章 字符串 . 获取字符串的长度: length() . 判断字符串的前缀或后缀与已知字符串是否相同 前缀 startsWith(String s) .后缀 endsWith(String s) ...
- [转]-Android Studio 快捷键整理分享-SadieYu
文章编辑整理:Android Studio 中文组 - SadieYu Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 ...
- Object Pascal 过程与函数
过程与函数 过程与函数是实现一定功能的语句块,是程序中的特定功能单元.可以在程序的其他地方被调用,也可以进行递归调用.过程与函数的区别在于过程没有返回值,而函数有返回值. 1.过程与函数的定义 过程与 ...
- Android网络编程系列 一 TCP/IP协议族之链路层
这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 数据链路层有三个目的: 为IP模块发送和 接收IP数据报. 为ARP模块发送ARP请求和接收ARP应答. 为RARP发送RA ...
- Java 文件IO
文件IO Java IO IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 按操作数据分为 字节流和字符流 字符流的 ...
- UIImageView 的contentMode属性
UIViewContentModeScaleToFill UIViewContentModeScaleAspectFit UIViewContentModeScaleAspectFill UIView ...
- [css] 自适应布局 移动端自适应
一.宽度自适应 三列布局左右固定.中间不固定或者两列布局,左边固定右边不固定 原文链接:http://www.cnblogs.com/2050/archive/2012/07/30/2614852.h ...
- ie6 span 换行IE6中float:right换行问题的替代解决方案
在IE6,IE7下使用<span>标签时,在加入右浮动样式后,会换行的bug解决方案: bug案例:新闻列表中,为使时间右对齐,加右浮动产生换行 <ul> <li> ...