国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

分享一個(gè)快速的Json(反)序列化開源項(xiàng)目 Jil

2019-11-17 03:01:10
字體:
供稿:網(wǎng)友
分享一個(gè)快速的Json(反)序列化開源項(xiàng)目 Jil

我們不缺少JSON的序列化庫,但我們?nèi)鄙僖粋€(gè)性能非常好的庫,這對于網(wǎng)站來說非常重要。今天我發(fā)現(xiàn)了Jil。

他是開源的代碼:https://github.com/kevin-montrose/Jil

在他主頁上有詳細(xì)的介紹其性能的表現(xiàn),我這里就不轉(zhuǎn)述了,他最重要的特點(diǎn)就是性能,Emit那當(dāng)然不會(huì)少了,當(dāng)想讓他超越其他的庫光一個(gè)Emit肯定不行,他還有很多其他的優(yōu)化。

  • 公共緩沖區(qū)

為介紹GC的壓力,他使用了諸如builder.CommonCharBuffer這樣的功能緩沖,builder.CommonStringBuffer也是這樣的應(yīng)用。

  • 內(nèi)聯(lián)

很多的方法,都標(biāo)記了[MethodImpl(MethodImplOptions.AggressiveInlining)]以便編譯器盡可能的內(nèi)聯(lián)。

  • 減少計(jì)算

比如將int轉(zhuǎn)換為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             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<object>.CharBufferSize - 1 - ptr);35         }

是不是覺得已經(jīng)很好了,但是他們還不斷進(jìn)取,改成這樣:

 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             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<object>.CharBufferSize - 1 - ptr);29         }

其中,那個(gè)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         }

可以這樣改,哈哈,其實(shí)我想這么改,不知道對不對?因?yàn)槲矣X得大多數(shù)情況下不是空白,所以一直要判斷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         }

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 原平市| 堆龙德庆县| 韶山市| 农安县| 长丰县| 固安县| 东兴市| 南和县| 汉寿县| 安达市| 和政县| 景泰县| 进贤县| 大足县| 彰化县| 巴彦淖尔市| 方正县| 吕梁市| 邵阳市| 任丘市| 鲁山县| 白水县| 武强县| 都昌县| 稻城县| 奎屯市| 交口县| 隆尧县| 察雅县| 丹巴县| 石柱| 东宁县| 沂源县| 汶上县| 土默特左旗| 东兴市| 罗甸县| 怀安县| 右玉县| 广州市| 临夏市|