【发布时间】:2015-06-02 19:20:14
【问题描述】:
来自节点docs关于从缓冲区创建类型化数组:
缓冲区的内存被解释为一个数组,而不是一个字节数组。那 是,
new Uint32Array(new Buffer([1,2,3,4]))创建了一个 4 元素Uint32Array带有元素[1,2,3,4],而不是带有单个元素的Uint32Array元素[0x1020304]或[0x4030201]。
这与普通 javascript 不同,后者从 ArrayBuffer 创建类型化数组视图使用 ArrayBuffer 的内存作为字节(如 C++ 中的 reinterpret_cast)。在节点缓冲区上操作时,我需要节点中的这种行为。
我可以将 Buffer 转换为 ArrayBuffer,但这对我的应用程序来说太慢了。 (我尝试了很多方法——但它们都是 O(n) 时间。)(编辑:我找到的最快的方法是 this,这是一个单一的 memmove 操作并且非常快,但仍然有在释放对原始 Buffer 的引用之前,至少会消耗 2 倍的内存。)
是否有任何 (fast/O(1)) 方法从 Buffer 中获取类型化数组,使用 Buffer 的内容作为字节而不是元素?(所需的类型化数组元素大小为 > 1个字节,不用说。)
【问题讨论】:
-
应该对数组进行什么类型的操作?如果是只读的,那为什么不直接通过偏移量来引用缓冲区中的元素呢?例如:
buf.readUInt32LE(i*4)其中i是数组索引? -
我需要快速重复地遍历数组。
read*方法真的很慢。 -
我认为没有比这更快的地方了:如果我们需要索引的Int32值
i:var k = i*4; return buf[k] | buf[k+1]<<8 | buf[k+2]<<16 | buf[k+3]<<256; -
我发明了一辆自行车:如果我们看一下模块
buffer.js- 正是阅读的实现方式。
标签: node.js