我正在研究不同的数据格式(字符串vs 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 ms,而json.parse只需378 ms,即使msgpack将数组从3602字节压缩到1303字节(假设每个字符占用2个字节)。
我最初假设的是较小的解码尺寸意味着更短的解码时间,但绝对不是这样。知道为什么吗?你看到评估msgpack的程序有什么问题吗?
由于
答案 0 :(得分:1)
您正在观察这种差异,因为JSON.parse
使用优化的本机实现,而msgpack5
是纯JS库。在其他语言(即C,Java等)中,MsgPack在大多数情况下会稍微快一些(例如,请参阅此基准:https://github.com/eishay/jvm-serializers/wiki)。
当存在显着差异时,几乎没有极端情况。例如,序列化数字/布尔值时,msgpack可能会更快。