node.js的v8.serialize和v8.deserialize

2018-2-5 13:19:57

这两天翻nodejs的api文档时发现了两个新API,v8.serialize和v8.deserialzie,官方给出的说明是这样的

The serialization API provides means of serializing JavaScript values in a way that is compatible with the HTML structured clone algorithm. The format is backward-compatible (i.e. safe to store to disk).

说到序列化,在JS中最容易想到的就是JSON.parseJSON.stringify这对函数了,但是由于他们处理的目标是字符串,所以在某些序列化比较频繁的场景下,可能会成为性能瓶颈。

v8.serializev8.deserialize这对函数则是面向Buffer的,不知道性能上会不会带来什么提升,虽然这还是一个Experimental级别的API,但是不妨先试试水

import * as benchmark from 'benchmark'
import * as v8 from 'v8'

const suite = new benchmark.Suite()

const obj = process.versions
const string = JSON.stringify(obj)
const buffer = v8['serialize'](obj)

suite.add('JSON.stringify', () => JSON.stringify(obj))

suite.add('JSON.parse', () => JSON.parse(string))

suite.add('v8.serialize', () => v8['serialize'](obj))

suite.add('v8.deserialize', () => v8['deserialize'](buffer))

suite.on('cycle', function(event) {
  console.log(String(event.target));
})
  .on('complete', function() {
    console.log('Fastest is ' + this.filter('fastest').map('name'));
  })
  .run();

跑出来的测试结果很有意思

JSON.stringify x 806,850 ops/sec ±3.87% (89 runs sampled)
JSON.parse x 535,804 ops/sec ±3.07% (86 runs sampled)
v8.serialize x 1,918 ops/sec ±232.96% (8 runs sampled)
v8.deserialize x 300,326 ops/sec ±1.50% (84 runs sampled)
Fastest is JSON.stringify

v8.serialize这个函数的稳定性特别差,我跑了十多次,每次这个函数都总是有着将近±200%的时差,最少的一次也有±80%,而他们的性能表现都远弱于JSON.parseJSON.stringify,也许是因为还在Experimental状态。那么这个函数还有什么用呢

仔细看了一下文档之后发现,Serialize API对比JSON有个最大的好处,就是遵守了The structured clone algorithm,能够保留一些js的内置对象,而不像JSON遇到非常规对象(Date,RegExp)之类的,会得到字符串或者干脆一个{},它能够正常的序列化及反序列化Date、RegExp、Blob、File、Map、Set等类型的对象

或许在将来性能稳定了之后,会有更大的用途吧