这两天翻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.parse
和JSON.stringify
这对函数了,但是由于他们处理的目标是字符串,所以在某些序列化比较频繁的场景下,可能会成为性能瓶颈。
而v8.serialize
和v8.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.parse
和JSON.stringify
,也许是因为还在Experimental状态。那么这个函数还有什么用呢
仔细看了一下文档之后发现,Serialize API对比JSON有个最大的好处,就是遵守了The structured clone algorithm,能够保留一些js的内置对象,而不像JSON遇到非常规对象(Date,RegExp)之类的,会得到字符串或者干脆一个{}
,它能够正常的序列化及反序列化Date、RegExp、Blob、File、Map、Set等类型的对象
或许在将来性能稳定了之后,会有更大的用途吧