[英]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.