我正在填充一个ArrayBuffer
与要通过发送的数据WebSocket
.
数据具有可变大小,因此在序列化时我动态扩展ArrayBuffer
如所须。
然而,当序列化过程完成时,我经常在缓冲区末尾有未使用的空间,我不想发送这些空间。
可以将所需部分复制到新的ArrayBuffer
,但是这对于内存和CPU来说是一种浪费。
是否可以发送一个子部分ArrayBuffer
over a WebSocket
无需复制?如果没有,是否有其他方法可以避免复制对性能的影响?
编辑并进行一些澄清。
核心问题在于WebSocket.send https://developer.mozilla.org/en-US/docs/Web/API/WebSocket#send()只接受DOMString
, ArrayBuffer
or Blob
。这些似乎都需要一个完整的缓冲区,而不是缓冲区的视图。
我不知道当我开始序列化时缓冲区有多大,因此它从 64 字节开始,并在每次溢出时加倍。那已经是some复制,但我可以调整初始大小,以便溢出是例外。我想避免的是必须将序列化数据从过大的缓冲区中复制出来。
在伪 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 中的疏忽。然而我知道它是由经验丰富的开发人员设计的,并且希望有一种方法可以完成我所追求的但我还没有遇到过的事情。