精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

比JSON.stringify快兩倍的fast-json-stringify

開發(fā) 前端
相信大家對JSON.stringify并不陌生,通常在很多場景下都會用到這個API,最常見的就是HTTP請求中的數(shù)據(jù)傳輸, 因為HTTP 協(xié)議是一個文本協(xié)議,傳輸?shù)母袷蕉际亲址覀冊诖a中常常操作的是 JSON 格式的數(shù)據(jù),所以我們需要在返回響應(yīng)數(shù)據(jù)前將 JSON 數(shù)據(jù)序列化為字符串。

前言?

相信大家對JSON.stringify并不陌生,通常在很多場景下都會用到這個API,最常見的就是HTTP請求中的數(shù)據(jù)傳輸, 因為HTTP 協(xié)議是一個文本協(xié)議,傳輸?shù)母袷蕉际亲址覀冊诖a中常常操作的是 JSON 格式的數(shù)據(jù),所以我們需要在返回響應(yīng)數(shù)據(jù)前將 JSON 數(shù)據(jù)序列化為字符串。但大家是否考慮過使用JSON.stringify可能會帶來性能風(fēng)險??,或者說有沒有一種更快的stringify方法。

JSON.stringify的性能瓶頸?

由于 JavaScript 是動態(tài)語言,它的變量類型只有在運(yùn)行時才能確定,所以 JSON.stringify 在執(zhí)行過程中要進(jìn)行大量的類型判斷,對不同類型的鍵值做不同的處理。由于不能做靜態(tài)分析,執(zhí)行過程中的類型判斷這一步就不可避免,而且還需要一層一層的遞歸,循環(huán)引用的話還有爆棧的風(fēng)險。

我們知道,JSON.string的底層有兩個非常重要的步驟:

  • 類型判斷
  • 遞歸遍歷

既然是這樣,我們可以先來對比一下JSON.stringify與普通遍歷的性能,看看類型判斷這一步到底是不是影響JSON.stringify性能的主要原因。

JSON.stringify 與遍歷對比

const obj1 = {}, obj2 = {}
for(let i = 0; i < 1000000; i++) {
obj1[i] = i
obj2[i] = i
}

function fn1 () {
console.time('jsonStringify')
const res = JSON.stringify(obj1) === JSON.stringify(obj2)
console.timeEnd('jsonStringify')
}

function fn2 () {
console.time("for");
const res = Object.keys(obj1).every((key) => {
if (obj2[key] || obj2[key] === 0) {
return true;
} else {
return false;
}
});
console.timeEnd("for");
}
fn1()
fn2()

從結(jié)果來看,兩者的性能差距在4倍左右,那就證明JSON.string的類型判斷這一步還是非常耗性能的。如果JSON.stringify能夠跳過類型判斷這一步是否對類型判斷有幫助呢?

定制化更快的JSON.stringify

基于上面的猜想,我們可以來嘗試實現(xiàn)一下:

現(xiàn)在我們有下面這個對象

const obj = {
name: '南玖',
hobby: 'fe',
age: 18,
chinese: true
}

上面這個對象經(jīng)過JSON.stringify處理后是這樣的:

JSON.stringify(obj)
// {"name":"南玖","hobby":"fe","age":18,"chinese":true}

現(xiàn)在假如我們已經(jīng)提前知道了這個對象的結(jié)構(gòu)

  • 鍵名不變
  • 鍵值類型不變

這樣的話我們就可以定制一個更快的JSON.stringify方法

function myStringify(obj) {
return `{"name":"${obj.name}","hobby":"${obj.hobby}","age":${obj.age},"chinese":${obj.chinese}}`
}

console.log(myStringify(obj) === JSON.stringify(obj)) // true

這樣也能夠得到JSON.stringify一樣的效果,前提是你已經(jīng)知道了這個對象的結(jié)構(gòu)。

事實上,這是許多JSON.stringify加速庫的通用手段:

  • 需要先確定對象的結(jié)構(gòu)信息
  • 再根據(jù)結(jié)構(gòu)信息,為該種結(jié)構(gòu)的對象創(chuàng)建“定制化”的stringify方法
  • 內(nèi)部實現(xiàn)依然是這種字符串拼接

更快的fast-json-stringify?

fast-json-stringify 需要JSON Schema Draft 7輸入來生成快速stringify函數(shù)。

這也就是說fast-json-stringify?這個庫是用來給我們生成一個定制化的stringily函數(shù),從而來提升stringify的性能。

這個庫的GitHub簡介上寫著「比 JSON.stringify() 快 2 倍」,其實它的優(yōu)化思路跟我們上面那種方法是一致的,也是一種定制化stringify方法。

語法

const fastJson = require('fast-json-stringify')
const stringify = fastJson(mySchema, {
schema: { ... },
ajv: { ... },
rounding: 'ceil'
})
  • schema: $ref 屬性引用的外部模式。
  • ajv: ajv v8 實例對那些需要ajv.
  • rounding: 設(shè)置當(dāng)integer類型不是整數(shù)時如何舍入。
  • largeArrayMechanism:設(shè)置應(yīng)該用于處理大型(默認(rèn)情況下20000或更多項目)數(shù)組的機(jī)制

scheme

這其實就是我們上面所說的定制化對象結(jié)構(gòu),比如還是這個對象:

const obj = {
name: '南玖',
hobby: 'fe',
age: 18,
chinese: true
}

它的JSON scheme是這樣的:

{
type: "object",
properties: {
name: {type: "string"},
hobby: {type: "string"},
age: {type: "integer"},
chinese: {type: 'boolean'}
},
required: ["name", "hobby", "age", "chinese"]
}

AnyOf 和 OneOf

當(dāng)然除了這種簡單的類型定義,JSON Schema 還支持一些條件運(yùn)算,比如字段類型可能是字符串或者數(shù)字,可以用 oneOf 關(guān)鍵字:

"oneOf": [
{
"type": "string"
},
{
"type": "number"
}
]

fast-json-stringify?支持JSON 模式定義的「anyOf」和「oneOf關(guān)鍵字。」兩者都必須是一組有效的 JSON 模式。不同的模式將按照指定的順序進(jìn)行測試。stringify在找到匹配項之前必須嘗試的模式越多,速度就越慢。

anyOf和oneOf使用ajv作為 JSON 模式驗證器來查找與數(shù)據(jù)匹配的模式。這對性能有影響——只有在萬不得已時才使用它。

關(guān)于 JSON Schema 的完整定義,可以參考 Ajv 的文檔,Ajv 是一個流行的 JSON Schema驗證工具,性能表現(xiàn)也非常出眾。

當(dāng)我們可以提前確定一個對象的結(jié)構(gòu)時,可以將其定義為一個 Schema,這就相當(dāng)于提前告訴 stringify 函數(shù),需序列化的對象的數(shù)據(jù)結(jié)構(gòu),這樣它就可以不必再在運(yùn)行時去做類型判斷,這就是這個庫提升性能的關(guān)鍵所在。

簡單使用?

const fastJson = require('fast-json-stringify')
const stringify = fastJson({
title: 'myObj',
type: 'object',
properties: {
name: {
type: 'string'
},
hobby: {
type: 'string'
},
age: {
description: 'Age in years',
type: 'integer'
},
chinese: {
type: 'boolean'
}
}
})

console.log(stringify({
name: '南玖',
hobby: 'fe',
age: 18,
chinese: true
}))
//

生成 stringify 函數(shù)

fast-json-stringify是跟我們傳入的scheme來定制化生成一個stringily函數(shù),上面我們了解了怎么為我們對象定義一個scheme結(jié)構(gòu),接下來我們再來了解一下如何生成stringify。

這里有一些工具方法還是值得了解一下的:

const asFunctions = `
function $asAny (i) {
return JSON.stringify(i)
}

function $asNull () {
return 'null'
}

function $asInteger (i) {
if (isLong && isLong(i)) {
return i.toString()
} else if (typeof i === 'bigint') {
return i.toString()
} else if (Number.isInteger(i)) {
return $asNumber(i)
} else {
return $asNumber(parseInteger(i))
}
}

function $asNumber (i) {
const num = Number(i)
if (isNaN(num)) {
return 'null'
} else {
return '' + num
}
}

function $asBoolean (bool) {
return bool && 'true' || 'false'
}

// 省略了一些其他類型......
`

從上面我們可以看到,「如果你使用的是 any 類型,它內(nèi)部依然還是用的 JSON.stringify。」所以我們在用TS進(jìn)行開發(fā)時應(yīng)避免使用 any 類型,因為如果是基于 TS interface? 生成 JSON Schema 的話,使用 any 也會影響到 JSON 序列化的性能。

然后就會根據(jù) scheme 定義的具體內(nèi)容生成 stringify 函數(shù)的具體代碼。而生成的方式也比較簡單:通過遍歷 scheme,根據(jù)不同數(shù)據(jù)類型調(diào)用上面不同的工具函數(shù)來進(jìn)行字符串拼接。感興趣的同學(xué)可以在GitHub上查看源碼

總結(jié)?

事實上fast-json-stringify只是通過靜態(tài)的結(jié)構(gòu)信息將優(yōu)化與分析前置了,通過開發(fā)者定義的scheme內(nèi)容可以提前知道對象的數(shù)據(jù)結(jié)構(gòu),然后會生成一個stringify函數(shù)供開發(fā)者調(diào)用,該函數(shù)內(nèi)部其實就是做了字符串的拼接。

  • 開發(fā)者定義 Object 的JSON scheme
  • stringify 庫根據(jù) scheme 生成對應(yīng)的模版方法,模版方法里會對屬性與值進(jìn)行字符串拼接
  • 最后開發(fā)者調(diào)用生成的stringify 方法
責(zé)任編輯:華軒 來源: 前端南玖
相關(guān)推薦

2021-05-06 05:30:33

JSONstringify()parse()

2019-06-11 15:25:03

JSON性能前端

2021-12-11 18:59:35

JavascriptJSON應(yīng)用

2021-12-22 09:08:39

JSON.stringJavaScript字符串

2020-05-25 14:37:31

JSON.string前端秘密特性

2020-03-29 20:16:09

JavaScript前端技術(shù)

2024-09-30 11:08:18

JSON局限性數(shù)據(jù)

2022-08-31 22:50:13

JavaScript函數(shù)JSON

2024-03-25 00:10:00

JSON后端開發(fā)

2025-08-25 09:36:06

2025-04-21 10:43:21

2023-01-17 16:25:18

前端開發(fā)JSON

2022-03-10 09:11:33

JavaScrip開發(fā)JSON

2024-05-08 08:32:25

架構(gòu)

2009-06-03 09:16:54

FirefoxMozilla瀏覽器

2023-05-12 08:11:58

JavaScriptJSON克隆

2023-05-08 09:00:46

JSON深拷貝對象

2024-11-06 08:32:02

JavaScriptTypeScript數(shù)據(jù)結(jié)構(gòu)

2024-01-05 07:46:15

JS克隆對象JSON

2022-04-29 10:17:51

數(shù)據(jù)庫Group-IB數(shù)據(jù)庫安全
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

久久精品男人天堂| 欧美猛男男办公室激情| 欧美中日韩免费视频| 中文字幕在线日亚洲9| 综合五月婷婷| 亚洲欧美日韩网| 亚洲一区二区中文字幕在线观看| 大香伊人中文字幕精品| 2021国产精品久久精品| 91久久在线视频| 国产免费av一区| 亚洲91中文字幕无线码三区| 日韩精品中文字幕在线播放| 在线免费看v片| 大胆人体一区| 午夜精品久久久久久久蜜桃app| 天堂精品视频| 青青青草网站免费视频在线观看| 久久99国产精品久久99果冻传媒| 91福利视频在线观看| 糖心vlog免费在线观看| 婷婷精品视频| 亚洲成人网在线观看| 911福利视频| 日韩久久一区二区三区| 天天综合网 天天综合色| 国产一级黄色录像片| 成人好色电影| 国产午夜亚洲精品理论片色戒| 国产精品久久久久久久久久久久午夜片| 国产字幕在线观看| 亚洲一区日本| 7777精品久久久久久| 久草视频在线免费看| 亚洲第一偷拍| 日韩性生活视频| 国产91丝袜美女在线播放| 久久中文资源| 日韩电影免费观看中文字幕| 香蕉久久久久久av成人| 香蕉免费一区二区三区在线观看| 欧美日韩夫妻久久| 污视频网站观看| 福利一区二区| 91传媒视频在线播放| www黄色av| 中文字幕不卡三区视频| 欧美日韩国产精品专区 | 亚洲国产人成综合网站| 国产日产欧美一区二区| 18av在线播放| 一区二区免费在线播放| 国产美女作爱全过程免费视频| 黄色网址视频在线观看| 18欧美亚洲精品| 中文字幕一区二区三区四区五区六区 | 天天综合91| 91精品国产综合久久福利| 国产美女视频免费看| 99久久久国产| 日韩一区二区电影网| 中文字幕永久免费| 欧美日韩麻豆| 亚洲丝袜av一区| 色婷婷粉嫩av| 欧美精品91| 97在线视频免费| 麻豆精品久久久久久久99蜜桃| 久久在线精品| 成人av电影天堂| 亚洲AV无码一区二区三区性| 欧美日韩中字| 亚洲免费高清视频| 国产美女永久免费无遮挡| 青青草成人影院| 欧美精品一区三区| 国产精品免费av一区二区| 久久久久久久高潮| 91美女片黄在线观| 婷婷综合激情网| 欧美激情综合在线| 97超碰国产精品| 黄色综合网址| 欧美一卡2卡3卡4卡| 小毛片在线观看| 成人精品久久| 欧美黑人又粗大| www.欧美色| 国产一区二区三区在线观看免费 | 91久久久久国产一区二区| 国产精品77777| 欧洲视频一区二区三区| 国产午夜精品久久久久免费视| 午夜激情一区二区三区| 最新天堂中文在线| 嗯用力啊快一点好舒服小柔久久| 亚洲毛片在线看| 91嫩草|国产丨精品入口| 亚洲精品123区| 国产日本欧美视频| 亚洲av成人无码久久精品老人 | 中文字幕精品久久| 国产福利久久久| 美国欧美日韩国产在线播放| 国产精品一区二区三区四区五区 | www.黄色网| 成人在线免费小视频| 久久人91精品久久久久久不卡| 欧美另类高清videos的特点| 成人高清免费观看| 久久久成人精品一区二区三区| 三妻四妾完整版在线观看电视剧| 337p亚洲精品色噜噜噜| 女人又爽又黄免费女仆| 亚洲人成高清| 91精品国产99久久久久久红楼 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 99re在线视频观看| 97电影在线看视频| 色综合视频一区二区三区高清| 男人的天堂免费| 婷婷综合社区| 国产精品欧美激情在线播放| 五月婷婷六月丁香| 亚洲一区二三区| 樱花草www在线| 色乱码一区二区三区网站| 欧美一区二区三区艳史| 午夜影院在线视频| 亚洲成人久久影院| 日本不卡视频一区| 韩国亚洲精品| 成人动漫视频在线观看完整版| 青青青青在线| 欧美日韩国产高清一区二区三区| 白白色免费视频| 久久国产高清| 鲁片一区二区三区| 交100部在线观看| 亚洲第一色在线| 国产亚洲小视频| 国产成人av电影在线| 国产手机视频在线观看| 国产精品美女久久久久人| 另类少妇人与禽zozz0性伦| 一区二区不卡视频在线观看| 亚洲欧洲性图库| 天天操精品视频| 在线观看国产精品入口| 91传媒免费看| 91九色国产在线播放| 日韩av综合网| 黄色污污网站在线观看| 国产女主播一区| 国产精欧美一区二区三区白种人| 99久久婷婷这里只有精品| 成人免费高清完整版在线观看| 日本欧美在线视频免费观看| 91精品啪在线观看国产60岁| 可以直接看的黄色网址| 国产乱码字幕精品高清av | 四虎4545www精品视频| 在线视频欧美性高潮| 91成人在线免费| 亚洲精品视频一区二区| 影音先锋黄色资源| 日日夜夜免费精品| 亚洲最大免费| 国产厕拍一区| 欧美自拍视频在线| 午夜在线观看视频| 精品精品国产高清a毛片牛牛 | 91精品国产aⅴ一区二区| 久久久久久久久久一区二区三区| 成人av在线网| 午夜精品在线免费观看| 亚洲高清影视| 六月婷婷久久| 日韩毛片免费视频一级特黄| 欧美大片欧美激情性色a∨久久| 天堂а√在线8种子蜜桃视频| 在线视频一区二区三| 老湿机69福利| 久久人人97超碰com| 国内自拍第二页| 亚洲尤物在线| 可以在线看黄的网站| 日韩a级大片| 成人精品一区二区三区电影黑人| 毛片在线网址| 一区二区三区精品99久久| 91tv国产成人福利| 欧美性生交xxxxx久久久| 五月天婷婷色综合| 久久精品夜色噜噜亚洲a∨| 日本特黄在线观看| 久久久成人网| 免费超爽大片黄| 99精品视频在线观看播放| 精品91免费| 免费精品一区| 国产精品久久久久久网站| 男女在线视频| 色噜噜狠狠狠综合曰曰曰88av| 国产欧美日韩成人| 日本高清成人免费播放| 日韩精品在线免费看| 亚洲人成影院在线观看| 国产免费一区二区三区网站免费| 成人午夜精品在线| 午夜xxxxx| 美女网站色91| 日本va中文字幕| 国产一区二区你懂的| 久久久天堂国产精品| 久久影院一区| 日韩美女一区| 久久成人高清| 欧美日韩精品综合| 全球av集中精品导航福利| 97国产超碰| 精品国产第一国产综合精品| 国产精品久久久久高潮| 一级毛片久久久| 青草青草久热精品视频在线网站| 国产色婷婷在线| 欧美极品在线播放| 人人超在线公开视频| 乱亲女秽乱长久久久| 国产一区久久精品| 精品国产一区久久久| 日韩在线资源| 日韩一区二区精品视频| 成人欧美亚洲| 视频直播国产精品| 91网在线播放| 日韩视频在线免费| 久久久久久国产精品免费无遮挡| 最近2019中文字幕mv免费看| 国产youjizz在线| 国产亚洲欧美日韩一区二区| 噜噜噜在线观看播放视频| 日韩精品黄色网| 三级视频在线| 亚洲欧洲日产国产网站| 国产高清免费av在线| 自拍偷拍亚洲欧美| 免费a级在线播放| 另类美女黄大片| 高h视频在线播放| 97在线观看视频| 日日夜夜天天综合| 国产精品亚洲аv天堂网| 日韩精品第二页| 产国精品偷在线| 欧美色图五月天| 天堂一区二区三区 | 国产妇女馒头高清泬20p多| 亚洲人体偷拍| 欧美一级片中文字幕| 奇米影视在线99精品| 日韩av一卡二卡三卡| 国产成人免费视频网站高清观看视频 | 日本三级黄色大片| 欧美日韩免费在线观看| 日本黄色中文字幕| 7777精品伊人久久久大香线蕉完整版| 国内老熟妇对白hdxxxx| 亚洲国产一区二区三区在线观看| 四虎电影院在线观看| 一区二区三欧美| 51xtv成人影院| 97视频在线观看视频免费视频| 欧美影视资讯| 99国精产品一二二线| 午夜欧洲一区| 国产精品久久成人免费观看| 亚洲人成久久| 国产一级片自拍| 99在线精品一区二区三区| 精品人妻中文无码av在线| 亚洲在线成人精品| aaa在线视频| 日韩欧美第一区| 黄色片在线免费看| 欧美成人久久久| 男人皇宫亚洲男人2020| 亚洲自拍偷拍在线| 国产一区二区三区四区二区| avove在线观看| 男女啪啪免费观看| 69视频在线| 九九九久久国产免费| 麻豆mv在线看| 国产日韩欧美成人| 欧美变态网站| 欧美亚洲视频一区| 国产亚洲高清视频| 亚洲av毛片在线观看| 国产亚洲婷婷免费| 国产在线综合网| 91麻豆精品国产91久久久使用方法| 四虎国产精品永远| 欧美日韩电影在线观看| 成人深夜福利| 噜噜噜噜噜久久久久久91| 国产精品av久久久久久麻豆网| 午夜精品在线免费观看| 99久久精品一区| 欧美精品一区二区蜜桃| 欧美在线一区二区三区| 亚洲色图狠狠干| 欧美黑人性猛交| 精品国产欧美| 成年人免费观看的视频| 日韩精品高清不卡| 一区二区三区免费在线观看视频| 一区二区三区欧美亚洲| 91福利在线观看视频| 亚洲精品有码在线| sm在线播放| 成人在线视频电影| 一区二区三区四区日韩| 国产一伦一伦一伦| 中文字幕av一区二区三区高| 中文字幕精品无码一区二区| 亚洲国产精品va| 国语对白在线刺激| 国产精品高清一区二区三区| 中国成人一区| 交换做爰国语对白| 亚洲美女少妇撒尿| 国产又粗又猛又爽又黄的视频一| 中文字幕av一区| 韩国理伦片久久电影网| 日韩视频精品| 日韩国产成人精品| 谁有免费的黄色网址| 色女孩综合影院| 二区在线视频| 国产精品视频在线观看| 日本一区二区免费高清| 性生活免费在线观看| 国产精品丝袜一区| 国产又粗又长又大视频| 久久综合久久美利坚合众国| 97久久中文字幕| 2021狠狠干| 成人免费视频免费观看| 欧美日韩精品区| 亚洲欧美日韩国产成人| 亚洲四虎影院| 中文字幕精品一区日韩| 国内精品写真在线观看| 欧美成欧美va| 亚洲级视频在线观看免费1级| 国产免费拔擦拔擦8x在线播放| 精品久久精品久久| 天堂成人免费av电影一区| 青娱乐国产视频| 欧美丰满一区二区免费视频 | 久久亚洲欧美日韩精品专区 | 乱一区二区三区在线播放| 久久久久久黄| 国产一二三区精品| 精品久久久久久久久久久久久久久久久 | 欧美亚洲一区二区三区| 日韩毛片无码永久免费看| 欧美日韩免费高清一区色橹橹 | 手机亚洲手机国产手机日韩| 992kp免费看片| 婷婷开心激情综合| 国产毛片av在线| 不卡一区二区三区视频| 国产一区二区高清| www.99re6| 日韩电影中文字幕在线| 国产a亚洲精品| 免费网站永久免费观看| 久久久久久久久久久久久久久99 | 国产亚洲亚洲国产一二区| 欧美一区二区激情| 日本一区二区三区在线观看| av中文字幕免费在线观看| 97av在线视频免费播放| 日韩国产欧美| 精品人妻一区二区三区日产| 精品视频色一区| 123区在线| 亚洲欧美日韩精品综合在线观看| 国产精品18久久久久久久网站| 中文字幕国产在线观看| 久久久精品网站| 欧美人与物videos另类xxxxx| 色网站在线视频| 在线视频你懂得一区二区三区| 日韩影视在线| 夜夜爽99久久国产综合精品女不卡 | 精品亚洲aⅴ无码一区二区三区| 精品久久五月天|