博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分享一个快速的Json(反)序列化开源项目 Jil
阅读量:5910 次
发布时间:2019-06-19

本文共 3956 字,大约阅读时间需要 13 分钟。

我们不缺少JSON的序列化库,但我们缺少一个性能非常好的库,这对于网站来说非常重要。今天我发现了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.CharBufferSize - 1;12 13             var copy = number;14             if (copy < 0)15             {16                 copy = -copy;17             }18 19             do20             {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.CharBufferSize - 1 - ptr);35         }

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

1         [MethodImpl(MethodImplOptions.AggressiveInlining)] 2         static void _CustomWriteInt(TextWriter writer, int number, char[] buffer) 3         { 4             var ptr = InlineSerializer.CharBufferSize - 1; 5  6             uint copy; 7             if (number >= 0) 8                 copy = (uint)number; 9             else10             {11                 writer.Write('-');12                 copy = 1 + (uint)~number;13             }14 15             do16             {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.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             return11                 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             return11                 c < 0x21 && (12                 c == 0x20 ||13                 c == 0x09 ||14                 c == 0x0A ||15                 c == 0x0D);16         }

转载地址:http://xlppx.baihongyu.com/

你可能感兴趣的文章
javascript-高级用法
查看>>
409. Longest Palindrome
查看>>
大话javascript 1期:作用域和作用域链
查看>>
软件开发学习的5大技巧,你知道吗?
查看>>
eosjs 文档(JSON-RPC)
查看>>
前嗅ForeSpider教程:通过链接列表采集正文数据(翻页)
查看>>
Python 基础起步 (四) 变量是什么东西 ?
查看>>
技术分享:阿里巴巴Dubbo实现的源码分析
查看>>
TiDB 助力东南亚领先电商 Shopee 业务升级
查看>>
神级命令awk之30分钟速成必看
查看>>
聊聊flink的FsCheckpointStreamFactory
查看>>
【进阶1-4期】JavaScript深入之带你走进内存机制
查看>>
[LeetCode] 270. Closest Binary Search Tree Value
查看>>
表格的增删改demo
查看>>
7.JS之深浅拷贝
查看>>
Swoole 源码分析——Server模块之TaskWorker事件循环
查看>>
Slog63_项目上线之ArthurSlog个人网站上线2
查看>>
bat批处理简介:Windows自动化之道
查看>>
Python之路--python基础2
查看>>
帆软入门与报表设计
查看>>