【发布时间】:2011-09-07 07:01:20
【问题描述】:
我需要序列化具有 1-100 个混合类型属性的中等复杂对象。
最初使用 JSON,然后我切换到 BSON,它稍微快了一点。
编码 10000 个样本对象
JSON: 1807mS
BSON: 1687mS
MessagePack: 2644mS (JS, modified for BinaryF)
我想要一个数量级的增长;它对系统的其余部分产生了非常糟糕的影响。
迁移到 BSON 的部分动机是需要对二进制数据进行编码,因此 JSON(现在)不适合。而且因为它只是跳过了对象中存在的二进制数据,所以它在那些基准测试中“作弊”。
剖析的 BSON 性能热点
- (不可避免?)将 UTF16 V8 JS 字符串转换为 UTF8。
- BSON 库中的 malloc 和字符串操作
BSON 编码器基于 Mongo BSON 库。
原生 V8 二进制序列化器可能很棒,但由于 JSON 是原生的并且可以快速序列化,我担心即使这样也无法提供答案。也许我最好的选择是优化 BSON 库的性能,或者编写我自己的 plus 找出更有效的方法来从 V8 中提取字符串。一种策略可能是为 BSON 添加 UTF16 支持。
所以我来这里是为了想法,也许是为了检查一下。
编辑
添加了 MessagePack 基准。这是从原始 JS 修改为使用 BinaryF。
C++ MessagePack 库可能会提供进一步的改进,我可能会单独对其进行基准测试以直接与 BSON 库进行比较。
【问题讨论】:
-
也许您可以提供一个jsperf.com 测试用例来帮助了解您需要存储的数据类型
-
只是标准 JS 对象:{param1:"name",param2:{paramA:1,paramB:[0x0,0x1,0x2],paramC:
}} 最多 100 个属性,任意嵌套,其中一些将包含使用 CommonJS BinaryF 的字节数组。如果没有 BinaryF 和 BSON 序列化程序,就不可能进行任何有用的比较。 -
您是否有任何链接/参考您用于 BSON、MsgPack 等的内容?
-
这些基准在 2013 年的适用性如何? PS:长期通过
window.btoa可以将二进制对象打包成JSON。 -
我已经很久没有运行这些测试了。 AFAIK window.btoa/atob 是 base64,因此需要额外的处理(如 JSON.stringify/parse)来获取/从 base64 兼容数据,所以它会更慢。
标签: javascript serialization v8 bson embedded-v8