麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

分享一個快速的Json(反)序列化開源項目 Jil

2019-11-17 03:01:10
字體:
來源:轉載
供稿:網友
分享一個快速的Json(反)序列化開源項目 Jil

我們不缺少JSON的序列化庫,但我們缺少一個性能非常好的庫,這對于網站來說非常重要。今天我發現了Jil。

他是開源的代碼:https://github.com/kevin-montrose/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<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         }

是不是覺得已經很好了,但是他們還不斷進取,改成這樣:

 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         }

其中,那個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         }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久国产中文 | av免费在线观 | 一区二区三区视频在线观看 | 免费一级毛片免费播放 | 毛片在线免费视频 | 久久艹国产精品 | 欧美18—19sex性护士中国 | 爽妇网国产精品 | 免费毛片免费看 | 成人毛片视频免费 | 草久在线观看视频 | videos 欧美| 91福利社在线 | 久久综合九色综合久久久精品综合 | 91一区二区三区久久久久国产乱 | 99视频观看| 天天色宗合 | 欧美久久久一区二区三区 | 久久久久久久久久美女 | 国产 一区 | 国产精品一区二区三区99 | 国产亚洲精品久久久久久久 | 看一级毛片 | 欧美高清一级片 | 久久久久久久久久久影视 | 国产成人高清在线观看 | 日本中文视频 | 中文字幕免费看 | av在线免费网| 国产精品久久久久久模特 | 国产免费观看电影网站 | 香蕉成人在线视频 | 最近日本电影hd免费观看 | 欧美一级黄视频 | 日本免费不卡一区二区 | 亚洲骚图 | 热99在线| 久久亚洲综合色 | 欧美在线观看视频网站 | 91九色精品国产 | 国产成人羞羞视频在线 |