为什么msgpack比json.parse慢?

时间:2016-07-07 22:43:14

标签: json msgpack

我正在研究不同的数据格式(字符串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的程序有什么问题吗?

由于

1 个答案:

答案 0 :(得分:1)

您正在观察这种差异,因为JSON.parse使用优化的本机实现,而msgpack5是纯JS库。在其他语言(即C,Java等)中,MsgPack在大多数情况下会稍微快一些(例如,请参阅此基准:https://github.com/eishay/jvm-serializers/wiki)。

当存在显着差异时,几乎没有极端情况。例如,序列化数字/布尔值时,msgpack可能会更快。