为什么 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 可能会更快