js传递json数据过大的解决方案

protobufjs

使用protobuf,定义如下结构
Person.protobuf

syntax = "proto3";

message Person {
  string name = 1;
  int32 age = 2;
}

Person.thrift

namespace java com.example.Person

struct Person {
  1: required string name,
  2: required i32 age
}

使用benchmark基线代码测试如下

const fs = require('fs');
const path = require('path');
const BSON = require('bson')
const msgpack = require('msgpack-lite');
const Benchmark = require('benchmark');
const thriftrw = require('thriftrw')
const protobuf = require('protobufjs');
const protobufPerson = protobuf.loadSync('Person.proto');
const Person = protobufPerson.lookupType('Person');
var thrift = new thriftrw.Thrift({
  source: fs.readFileSync(path.join(__dirname, 'Person.thrift'), 'utf8'),
  allowOptionalArguments: true,
});

const jsonData = {name: "John", age: 30};

let json_result,bson_result,msgpack_result,proto_result,thrift_result,dimbin_result;
console.log('----------serialize----------')
new Benchmark.Suite()
  .add('JSON', ()=>{ json_result = JSON.stringify(jsonData)})
  .add('BSON', ()=>{ bson_result = BSON.serialize(jsonData)})
  .add('msgpack', ()=>{ msgpack_result = msgpack.encode(jsonData)})
  .add('protobuf', ()=>{ proto_result = Person.encode(jsonData).finish()})
  .add('thrift', ()=>{ thrift_result = thrift.Person.toBuffer(jsonData)})
  .add('dimbin', ()=>{ dimbin_result = dimbin.serialize([dimbin.stringsSerialize(jsonData.name),new Uint32Array([30])])})
  .on('cycle', (event) => console.log(String(event.target)))
  .on('complete', function() {console.log('Fastest is ' + this.filter('fastest').map('name'))})
  .run()
console.log('----------deserialize----------')
new Benchmark.Suite()
  .add('JSON—de', ()=>{ JSON.parse(json_result)})
  .add('BSON-de', ()=>{ BSON.deserialize(bson_result)})
  .add('msgpack-de', ()=>{ msgpack.decode(msgpack_result)})
  .add('protobuf-de', ()=>{ Person.decode(proto_result)})
  .add('thrift-de', ()=>{ thrift.Person.fromBuffer(thrift_result)})
  .add('dimbin-de', ()=>{ o=dimbin.parse(dimbin_result);dimbin.stringsParse(o[0])})
  .on('cycle', (event) => console.log(String(event.target)))
  .on('complete', function() {console.log('Fastest is ' + this.filter('fastest').map('name'))})
  .run()

执行结果如下:
小文件json数据解析,probuf比msgpack、thrift的快一个数量级
在这里插入图片描述

10m左右的json数据解析,probuf比json快一个数量级,msgpack、thrift和probuf差别不大
在这里插入图片描述
还有一些其他的框架,如fastcdr和flatbuffer,js支持不太好就没有写测试例子了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/254316.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android笔记(十八):面向Compose组件结合Retrofit2和Rxjava3实现网络访问

一、Retrofit2 Square公司推出的Retrofit2库(https://square.github.io/retrofit/),改变了网络访问的方式。它实现了网络请求的封装。Retrofit库采用回调处理方式,使得通过接口提交请求和相应的参数的配置,就可以获得…

3 - Electron BrowserWindow对象 关于窗口

优雅的打开应用~ 当加载缓慢,打开应用的一瞬间会出现白屏,以下方法可以解决 const mainWindow new BrowserWindow({ show: false }) mainWindow.once(ready-to-show, () > {mainWindow.show() }) 设置背景颜色 const win new BrowserWindow({ b…

高德地图画线,适用于在地图上画出各种道路

addPolyline() {let AMap this.AMaplet polyline new AMap.Polyline({// map: this.map,// polyline 路径path: [new AMap.LngLat("119.368904", "30.913423"),new AMap.LngLat("119.382122", "30.901176"),],strokeColor: #F3D930,…

Windows下配置最新ChromeDriver

1、问题 在使用代码调用谷歌浏览器时会出错: from selenium import webdriver driver webdriver.Chrome() SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser versi…

低噪声 256 细分微步进电机驱动MS35776

产品简述 MS35776 是一款高精度、低噪声的两相步进电机驱动芯 片。芯片集成了快速模式与静音模式来满足高速与低速下的不 同应用。芯片内置功率 MOSFET ,长时间工作平均电流可以达 到 1.4A ,峰值电流 2A 。芯片集成了欠压保护、过流保护、短 地…

java中实现定时给微信群中发送每日天气情况

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 实现效果 这个功能,适用于做私域的朋友,下面是效果,大家可以参考一下; 🔴🟠🟡 大家好!我是…

【工具使用-有道云笔记】如何在有道云笔记中插入目录

一,简介 本文主要介绍如何在有道云笔记中插入目录,方便后续笔记的查看,供参考。 二,具体步骤 分为两个步骤:1,设置标题格式;2,插入标题。非常简单~ 2.1 设置标题格式 鼠标停在标…

【算法与数据结构】455、LeetCode分发饼干

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:因为大饼干可以满足大胃口的孩子也必然可以满足小胃口的孩子,如果要尽可能的满足孩子的胃口…

【LeetCode刷题笔记】数学

50. Pow(x, n) 解题思路: 1. 绝对值 + 快速幂 + 迭代 ,由于题目 n 可能是 系统最小值 ,因此使用 n 的 绝对值 。 如果 n 是 系统最小值 ,先让

使用Log4j与log4j2配置mybatisplus打印sql日志

环境:项目非完全spring项目,没有spring的配置文件。执行sql时老是不打印sql语句。因此进行修改,过程比较坎坷,记录一下。 我尝试使用log4j和log4j2进行配置 最终把这两种全部配置记录上 Log4j配置 如果项目用的是log4j需要进行配置…

Linux——权限

个人主页:日刷百题 系列专栏:〖C语言小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 🌎欢迎各位→点赞👍收藏⭐️留言📝 ​ ​ 一、 Linux下用户的分类 Linux下有两种用户: 1. root(超级管理员用户…

【重点】【前缀树】208.实现Trie(前缀树)

题目 前缀树介绍:https://blog.csdn.net/DeveloperFire/article/details/128861092 什么是前缀树 在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查…

Python 列表推导式:简洁、高效的数据操作艺术

文章目录 Python 列表推导式:简洁、高效的数据操作艺术1. 列表推导式:语法糖的力量2. 过滤元素:带条件的列表推导式3. 复杂的数据结构:嵌套的列表推导式4. 数据变形:带表达式的列表推导式5. 推广至其他数据结构&#x…

LearnDash LMS ProPanel在线学习系统课程创作者的分析工具

点击阅读LearnDash LMS ProPanel在线学习系统课程创作者的分析工具原文 LearnDash LMS ProPanel在线学习系统课程创作者的分析工具通过整合报告和作业管理来增强您的 LearnDash 管理体验,使您能够发送特定于课程的通信,并显示课程的实时活动&#xff01…

堆与二叉树(上)

本篇主要讲的是一些概念,推论和堆的实现(核心在堆的实现这一块) 涉及到的一些结论,证明放到最后,可以选择跳过,知识点过多,当复习一用差不多,如果是刚学这一块的,建议打…

shell实现折线图

生成 100 行数据到文件 file.txt for ((i1; i<100; i));doif [ ${i} -lt 10 ];thennum$(( (RANDOM % 5) 10 i ))elsenum$(( (RANDOM % 5) 10 15 ))fiecho ${num} done 通过文件 file.txt 生成折线图 #!/bin/bash# 指定文件名&#xff0c;该文件必须为数字 file./file.…

Redis最实用的基础入门数据结构和常用指令使用教程

1.单线程redis操作为什么那么快&#xff1f; 一方面&#xff0c;Redis 的大部分操作在内存上完成&#xff0c;再加上它采用了高效的数据结构&#xff0c;例如哈希表和跳表&#xff0c;这是它实现高性能的一个重要原因。另一方面&#xff0c;就是 Redis 采用了多路复用机制&…

patchless amsi学习(中)

DR7 DR7被称为“调试控制寄存器”&#xff0c;允许对每个硬件断点进行精细控制。其中&#xff0c;前8位控制是否启用了特定的硬件断点。偶数位&#xff08;0、2、4、6&#xff09;称为L0-L3&#xff0c;在本地启用了断点&#xff0c;这意味着仅在当前任务中检测到断点异常时才…

配置Nginx解决跨域问题

Nginx 中将前端请求中的所有以 “/apiUrl” 开头的路径代理到 http://192.12.200.101:9813 例如&#xff1a; /apiUrl/login > http://192.12.200.101:9813/login 配置nginx环境 进入Nginx 的配置文件编辑界面: sudo nano /etc/nginx/conf.d/default.conf开始编辑 defaul…

7.实现任务的rebalance

1.设计 1.1 背景 系统启动后&#xff0c;所有任务都在被执行&#xff0c;如果这时某个节点宕机&#xff0c;那它负责的任务就不能执行了&#xff0c;这对有稳定性要求的任务是不能接受的&#xff0c;所以系统要实现rebalance的功能。 1.2 设计 下面是Job分配与执行的业务点…
最新文章