gpt4 book ai didi

javascript - 在不复制的情况下通过 WebSocket 发送 ArrayBuffer 的子段

转载 作者:行者123 更新时间:2023-11-29 21:00:30 25 4
gpt4 key购买 nike

我正在用要通过 WebSocket 发送的数据填充 ArrayBuffer

数据的大小可变,因此在序列化时我会根据需要动态扩展 ArrayBuffer

但是,当序列化过程完成时,我通常不想发送缓冲区末尾未使用的空间。

可以将所需的部分复制到新的 ArrayBuffer 中,但这在内存和 CPU 方面是一种浪费。

是否可以通过 WebSocket 发送 ArrayBuffer 的子部分而不进行复制?如果没有,是否有另一种方法可以避免复制对性能的影响?


编辑一些说明。

核心问题是WebSocket.send只接受 DOMStringArrayBufferBlob。这些似乎都需要一个完整的缓冲区,而不是缓冲区 View 。

我不知道开始序列化时缓冲区有多大,所以它从 64 字节开始,每次溢出时都会加倍。这已经是一些复制,但我可以调整初始大小,以便溢出是异常(exception)。我想避免的是必须将序列化数据从过大的缓冲区中复制出来。

在伪 JS 中:

function serialiseAndSend(webSocket, message) {

// Allocate a buffer (assume it's large enough)
const buffer = new ArrayBuffer(64);

// Serialise into that buffer, and obtain the number of bytes written (<= 64)
const bytesWritten = serialise(buffer, message);

// The first 'bytesWritten' bytes of 'buffer' contain my message, the rest is zeroed.
//
// I want to send that sub-portion without allocating another buffer.

// This function would be great (buffer, start, count) but doesn't exist
webSocket.send(buffer, 0, bytesWritten);

// Instead I think I have to allocate and send a copy
const copy = buffer.slice(0, bytesWritten);
webSocket.send(copy);
}

这种模式在其他平台/语言中很常见,似乎是对 WebSocket API 的疏忽。但是我知道它是由经验丰富的开发人员设计的,我希望有一种方法可以完成我尚未遇到的事情。

最佳答案

编辑、更新

MDN不是 specification .关于 WebSocket.send() 方法的 MDN 文档省略了 ArrayBufferView实际规范中包含选项,请参阅 https://bugzilla.mozilla.org/show_bug.cgi?id=1409752 .


您可以使用 .subarray()为现有的 TypedArray

创建一个新 View

Also note that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.

关于javascript - 在不复制的情况下通过 WebSocket 发送 ArrayBuffer 的子段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46718355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com