用纯js的BSON库在Web和原生上的性能差异巨大

新建了个工程,用npm install bson安装了BSON库,写了下面的测试代码:

       // Serialize document
        var doc = {
            name: "aafewfff",
            level: 33,
            job: 1,
            attr: {
                maxHP: 2123212.0,
                phyAtk: 23424.22,
                phyDef: 23242,
                magAtk: 234234,
                magDef: 232342,
            },
        }

        var t = new Date().getTime();
        for (var i = 0; i < 10000; ++i) {
            // Serialize a document
            var data = bson.serialize(doc)
            // Deserialize the resulting Buffer
            var doc_2 = bson.deserialize(data)
        }
        console.log(new Date().getTime() - t);

在浏览器里跑,打印出业的时间是:124ms
在原生版本里跑,时间是:2024ms

差了10几倍的时间,我以为同样是JS,应该没有差异的呀?
@jare @panda

可以试一下在 Firefox v33 浏览器上跑一下

现在是原生版本超级慢,浏览器版本感觉还可以。

麻烦试一下贴一下结果

NewProject.rar (860.5 KB)

我把测试工程放上来了,打开运行就会有结果,代码就在HelloWorld.js里面。
分别测试了bson和msgpack这两个库,麻烦看一下。

安装了FireFoxv33,输出的日志如下:

上面那个日志可疑啊,是这个导致变得很慢了?

很有可能,之所以让你试 Firefox v33 是因为我们 Creator 的原生版本中用的就是 Firefox v33 中的 Spidermonkey,所以性能表现会比较接近。看起来是 BSON 库触发了 Spidermonkey 的这个问题,可以看一下具体警告行数做了什么

是下面两句代码,警告的是下面这一句:

var arr = new Uint8Array(1)
arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}

你们有计划将原生的引擎改为V8吗?这样是不是就和Node一致了?
@panda

这里的确就是修改了 proto,但是感觉完全没意义啊,可以注释掉试试

V8 和 Spidermonkey 还是有不小差异的,迁移的成本很高,目前暂时没有计划

嗯,不是这个导致的,因为换用MsgPack的库,也一样是很慢的。
这只能归结为SpiderMonkey的性能问题了。

应该是 spidermonkey 对 __proto__ 的赋值操作没有做过良好优化导致的…… 很多第三方库到这里就跪了

经过反复测试,最后决定还是用JSON了,用JSON.stringifyJSON.parse的序列化时间比用BSON库快好多。
在Chrome,BSON是124,JSON是37,足足快了4倍。
在SpiderMonkey,BSON是1643,JSON是40,快了N倍。

至于BSON的大小优势,在速度面前,只好放弃了。

1赞