繁体   English   中英

Javascript / node.js对象,可以存储任意二进制数据并非常快速地追加

[英]Javascript/node.js Object that can store arbitrary binary data and do appending very fast

我需要在Node.js应用程序中处理大量二进制数据。 当数据通过回调到达我的代码部分的许多小块(以Buffer对象的格式)时,我必须每秒执行许多操作,例如追加,切片等。

我很想将二进制数据存储在Javascript字符串中,该字符串支持追加,切片等。但是不幸的是,我无法真正将(任意)二进制数据转换为字符串,而字符串必须具有有效的编码,例如UTF8。

要使用Buffer对象,附加操作将变得非常昂贵。 例如,以下代码段在我的P7处理器上花费了1.5秒。

var a = new Buffer([1])
var b = new Buffer([2])
var start = new Date()
for (i=0; i<100000; i++) {
a = Buffer.concat([a, b], a.length + 1)
}
console.log(new Date() - start)

如果我在假设a和b是字符串的情况下添加简单的字符串a += b ,则只需0.01秒。

我想知道Javascript中是否有一个对象可以存储任意二进制数据并支持非常高效的追加。

提前致谢

UPDATE1

尝试使用TypeArray,速度要好一些,但仍然比字符串附加要慢得多。

var a = new Uint8Array(),
    b = new Uint8Array(1);
var c
b[0] = 11
var start = new Date()
for (i=0; i<100000; i++) {
    c = new Uint8Array (a.length + b.length)
    c.set(a,0)
    c.set(b, a.length)
    a = c
}

console.log(new Date() - start)
console.log(a.length)

我认为smart-buffer可能就是您想要的? 它允许您将其他缓冲区写入其中,并将根据需要动态调整大小。

测试脚本:

const SmartBuffer = require('smart-buffer').SmartBuffer;

// set up buffers
var a = new Buffer([1])
var smart_a = new SmartBuffer();
smart_a.writeInt8(1);

var b = new Buffer([2])

// time buffer concatenation method
console.time("Buffer concatenation");
for (let i = 0; i < 100000; i++) {
    a = Buffer.concat([a, b], a.length + 1)
}
console.timeEnd("Buffer concatenation");

// time smart buffer writeBuffer method
console.time("Smart Buffer writing");
for (let i = 0; i < 100000; i++) {
    smart_a.writeBuffer(b);
}
let final_smart_a = smart_a.toBuffer();
console.timeEnd("Smart Buffer writing");

// check that resulting buffers match
for (let i = 0; i < 100000; i++) {
    console.assert(a[i] == final_smart_a[i]);
}

结果(1个试验):

Buffer concatenation: 2110.282ms
Smart Buffer writing: 14.971ms

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM