我们不缺少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的更多相关文章

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

    http://zijan.iteye.com/blog/2041894 这个项目最早(2008年)是用于一个网络游戏的Cache Server,以及一个电子商务的Web Session服务.后来不断增 ...

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

    [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...

  3. 分享一个快速设置背景的js 自动获取背景图的长宽

    我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> ...

  4. 微人事 star 数超 10k,如何打造一个 star 数超 10k 的开源项目

    看了下,微人事(https://github.com/lenve/vhr)项目 star 数超 10k 啦,松哥第一个 star 数过万的开源项目就这样诞生了. 两年前差不多就是现在这个时候,松哥所在 ...

  5. 我发起了一个 支持 ServerFul 架构 的 .Net 开源项目 ServerFulManager

    大家好,  我发起了一个 支持 ServerFul 架构 的 .Net 开源项目 ServerFulManager . ServerFulManager 的 目标 是 实现一个 支持 ServerFu ...

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

    大家好,  我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain  用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 A ...

  7. C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism

    --概述 这个项目演示了如何在WPF中使用各种Prism功能的示例.如果您刚刚开始使用Prism,建议您从第一个示例开始,按顺序从列表中开始.每个示例都基于前一个示例的概念. 此项目平台框架:.NET ...

  8. 分享一个快速测试ios软件的工具

    简易IPA安装地址生成器 地址: https://www.neicexia.com/IPADistribute/Resources/index.html?fromsite#IPADistribute- ...

  9. 分享一个快速审查js操作Dom的css

    第一步 打开开发者工具第二步 打开 Sources 面板第三步 执行用户操作让对象可见(例如鼠标悬停)第四步 在元素可见的时候按下 F8(与“暂停脚本执行”按钮相同)第五步 点击开发者工具左上角的“选 ...

随机推荐

  1. [JAVA设计模式]第四部分:行为模式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. 迷你sql profile,给缺少sql跟踪的朋友们

    如果你的数据库没有sqlprofile,看这里. 如果你没时间装sqlserver那一系列的东西,看看这里,也许能解决呢. 这是一个迷你版的sqlprofile ,在win7下测试,链接sqlserv ...

  3. amd64_or_ia64?

    amd64 网上资料: 1. IA64是intel推出的架构,AMD64是AMD推出的.IA64不兼容原有的32位x86架构指令集,后来被证明这种做法是不成功的,于是Intel发展处IA64e架构,对 ...

  4. 树的计数 + prufer序列与Cayley公式 学习笔记

    首先是 Martrix67 的博文:http://www.matrix67.com/blog/archives/682 然后是morejarphone同学的博文:http://blog.csdn.ne ...

  5. Android目标大纲

    为了更好的便于复习 特制作此份大纲 1 J2SE基础 集合框架源码解析2 JVM3 TCP/IP HTTP4 数据结构与算法5 Android6 项目技术点7 开源库解析8 设计模式

  6. Maven——使用Maven构建多模块项目

    原文:http://www.cnblogs.com/xdp-gacl/p/4242221.html 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为doma ...

  7. 转自“脚本之家”!!JDBC之PreparedStatement类中预编译的综合应用解析

    JDK 文档:SQL 语句被预编译并存储在 PreparedStatement 对象中(PreparedStatement是存储在JDBC里的,初始化后,缓存到了JDBC里),然后可以使用此对象多次高 ...

  8. LTIB常用命令2

    LTIB 编译配置选项 根据说明文档,ltib 可以通过以下的命令配置: * <verbatim># ./ltib</verbatim>          安装后第一次运行,采 ...

  9. iOS开发 判断扫码是否为有效网址

    - (BOOL)achiveStringWithWeb:(NSString *)infor { NSString *emailRegex = @"[a-zA-z]+://.*"; ...

  10. Python开发简单爬虫 - 慕课网

    课程链接:Python开发简单爬虫 环境搭建: Eclipse+PyDev配置搭建Python开发环境 Python入门基础教程 用Eclipse编写Python程序   课程目录 第1章 课程介绍 ...