【问题标题】:What's the difference between node.js Buffer and WebAssembly Memory?node.js 缓冲区和 WebAssembly 内存有什么区别?
【发布时间】:2017-11-24 17:56:18
【问题描述】:

我想知道是否可以替换 Node.js Buffer 使用 WebAssembly 分配内存 Memory?

如果有,有什么优势吗?

【问题讨论】:

  • 这个问题就像问沃尔沃的手套箱和宝马的引擎盖有什么区别。当然,两者都包含东西。

标签: javascript node.js webassembly


【解决方案1】:

在 node.js 中,Buffer 和 WebAssembly Memory 对象都有一个 buffer 属性,其类型为 ArrayBuffer,它本身被定义为 Typed Arrays in ECMAScript/JavaScript 2015 的一部分。

node --version
v8.1.2
node
> mem = new WebAssembly.Memory({initial: 10});
Memory {}
> buf = new Buffer("abc")
<Buffer 61 62 63>
> mem.buffer
ArrayBuffer { byteLength: 655360 }
> buf.buffer
ArrayBuffer { byteLength: 8192 }

一个普通的 ArrayBuffer 对象只是一个字节流的容器。为了访问和使用它,您必须将其包装/转换为类型化数组(例如 Uint8Array、DataView 等)、node.js 缓冲区或 WebAssembly 内存。

【讨论】:

  • 感谢@kanaka 的答案。我不知道它们下面都有一个 ArrayBuffer。有了这个,使用 WebAssembly 内存或直接使用 ArrayBuffer 而不是 node.js 缓冲区是否有意义?
  • 这真的取决于你想要完成什么。您可以在类型化数组之间非常有效地复制(尤其是如果您使用set 方法),因此为不同目的使用不同类型并根据需要进行转换/复制可能不是一个大的性能问题,除非您正在做的是真的 性能敏感。
【解决方案2】:

一个显着的区别是WebAssembly.Memory 可以通过Memory.prototype.grow 调整大小,而Buffer 不能。

另一个是WebAssembly.Memory 被设计为可以使用硬件内存保护来删除动态边界检查,因此它的长度被限制为 64kb 的倍数。 Buffer 可以有任意字节长度。

【讨论】:

    猜你喜欢
    • 2014-10-10
    • 2014-01-09
    • 2014-09-18
    • 2017-07-15
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多