为什么 msgpack 比 json.parse 慢?
Why msgpack is slower than json.parse?
我正在研究不同的数据格式(字符串与 masgpack 字节)以高效编码和解码 json。我将收到的 jsons 不会有任何模式,至少要保持它的通用性,我假设 jsons 不遵循任何特定模式。
这里是我用来评价的一个小JS:
// skip-eslint
var msgpack = require('msgpack5')() // namespace our extensions
, encode = msgpack.encode
, decode = msgpack.decode;
var helloWorldObj = { 'hello': 'world' };
var json = [];
var MAX_DECODE_REPEAT = 10000;
var MAX_REPEAT = 100;
console.log('json,data,time');
//msgpack
for ( var i=0;i<MAX_REPEAT;i++) {
json = [];
// create i+1 length json array
for(var k=0;k<=i;k++){
json.push(helloWorldObj);
}
// encode the json array
var encodedJson = encode(json);
var start = new Date().getTime();
// start decoding =>msgpack
for(var count=0;count<MAX_DECODE_REPEAT;count++){
decode(encodedJson);
}
var end = new Date().getTime();
var time = end-start;
console.log(json.length +',' + encodedJson.length + ','+time);
}
// JSON.parse
for ( var i=0;i<MAX_REPEAT;i++) {
json = [];
// create i+1 length json array
for(var k=0;k<=i;k++){
json.push(helloWorldObj);
}
// stringify the json array
var jsonString = JSON.stringify(json);
var start = new Date().getTime();
// start decoding =>msgpack
for(var count=0;count<MAX_DECODE_REPEAT;count++){
JSON.parse(jsonString);
}
end = new Date().getTime();
time = end-start;
console.log(json.length +',' + jsonString.length*2 + ','+time);
}
逻辑很简单:我正在增加数组的长度,并试图找出解码器解码数组 10000 次所花费的时间。
令我惊讶的是,msgpack 占用的空间是 json.parse 的 10 倍。解码 100 长度的数组 msgpack 需要 4694 毫秒,而 json.parse 只需要 378 毫秒,即使 msgpack 将数组从 3602 字节压缩到 1303 字节(假设每个字符需要 2 个字节)。
我最初假设的是较小的解码尺寸意味着较短的解码时间,但事实并非如此。知道为什么吗?您是否发现评估 msgpack 的程序有任何问题?
谢谢
您观察到这种差异是因为 JSON.parse
在底层使用优化的本机实现,而 msgpack5
是一个纯 JS 库。在其他语言(即 C、Java 等)中,MsgPack 在大多数情况下会稍微快一些(例如,请参阅此基准测试:https://github.com/eishay/jvm-serializers/wiki)。
存在显着差异的极端情况很少。例如,在序列化 numbers/booleans.
时,msgpack 可能会更快
我正在研究不同的数据格式(字符串与 masgpack 字节)以高效编码和解码 json。我将收到的 jsons 不会有任何模式,至少要保持它的通用性,我假设 jsons 不遵循任何特定模式。
这里是我用来评价的一个小JS:
// skip-eslint
var msgpack = require('msgpack5')() // namespace our extensions
, encode = msgpack.encode
, decode = msgpack.decode;
var helloWorldObj = { 'hello': 'world' };
var json = [];
var MAX_DECODE_REPEAT = 10000;
var MAX_REPEAT = 100;
console.log('json,data,time');
//msgpack
for ( var i=0;i<MAX_REPEAT;i++) {
json = [];
// create i+1 length json array
for(var k=0;k<=i;k++){
json.push(helloWorldObj);
}
// encode the json array
var encodedJson = encode(json);
var start = new Date().getTime();
// start decoding =>msgpack
for(var count=0;count<MAX_DECODE_REPEAT;count++){
decode(encodedJson);
}
var end = new Date().getTime();
var time = end-start;
console.log(json.length +',' + encodedJson.length + ','+time);
}
// JSON.parse
for ( var i=0;i<MAX_REPEAT;i++) {
json = [];
// create i+1 length json array
for(var k=0;k<=i;k++){
json.push(helloWorldObj);
}
// stringify the json array
var jsonString = JSON.stringify(json);
var start = new Date().getTime();
// start decoding =>msgpack
for(var count=0;count<MAX_DECODE_REPEAT;count++){
JSON.parse(jsonString);
}
end = new Date().getTime();
time = end-start;
console.log(json.length +',' + jsonString.length*2 + ','+time);
}
逻辑很简单:我正在增加数组的长度,并试图找出解码器解码数组 10000 次所花费的时间。
令我惊讶的是,msgpack 占用的空间是 json.parse 的 10 倍。解码 100 长度的数组 msgpack 需要 4694 毫秒,而 json.parse 只需要 378 毫秒,即使 msgpack 将数组从 3602 字节压缩到 1303 字节(假设每个字符需要 2 个字节)。
我最初假设的是较小的解码尺寸意味着较短的解码时间,但事实并非如此。知道为什么吗?您是否发现评估 msgpack 的程序有任何问题?
谢谢
您观察到这种差异是因为 JSON.parse
在底层使用优化的本机实现,而 msgpack5
是一个纯 JS 库。在其他语言(即 C、Java 等)中,MsgPack 在大多数情况下会稍微快一些(例如,请参阅此基准测试:https://github.com/eishay/jvm-serializers/wiki)。
存在显着差异的极端情况很少。例如,在序列化 numbers/booleans.
时,msgpack 可能会更快