通过 WebSocket 发送 ArrayBuffer 的子段而不进行复制

2024-04-21

我正在填充一个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 中的疏忽。然而我知道它是由经验丰富的开发人员设计的,并且希望有一种方法可以完成我所追求的但我还没有遇到过的事情。


编辑、更新

MDN https://developer.mozilla.org/en-US/docs/Web/API/WebSocket#send()不是规格 https://html.spec.whatwg.org/multipage/web-sockets.html#network。 MDN 文档关于.send()的方法WebSocket省略了ArrayBufferView https://heycam.github.io/webidl/#common-ArrayBufferView实际规格中包含选项,请参见https://bugzilla.mozilla.org/show_bug.cgi?id=1409752 https://bugzilla.mozilla.org/show_bug.cgi?id=1409752.


您可以使用.subarray() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray为现有视图创建新视图TypedArray

另请注意,这是在现有缓冲区上创建一个新视图; 新对象内容的更改将影响原始对象 反之亦然。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 WebSocket 发送 ArrayBuffer 的子段而不进行复制 的相关文章

随机推荐

  • python 中两个字符串的 Anagram 测试

    这是问题 编写一个名为 test for anagrams 的函数 该函数接收两个字符串 参数 均由字母字符组成 返回 如果两个字符串是字谜词 则为 True 否则为 False 两个字符串是 如果一个字符串可以通过重新排列来构造 则为 a
  • Silverlight 异步单元测试

    我在使用 Silverlight 单元测试框架时遇到了一个奇怪的问题 每次执行的第一个方法都会失败 我使用完全相同的代码进行了第二次测试 并且通过了 第一次调用的奇怪之处在于 它实际上是在等待超时and then执行存储库调用 如果您关心的
  • 张量流 LSTM 模型中的 NaN 损失

    以下网络代码应该是经典的简单 LSTM 语言模型 一段时间后开始输出 nan 损失 在我的训练集上 这需要几个小时 而且我无法在较小的数据集上轻松复制它 但在认真的训练中 这种情况总是会发生 Sparse softmax with cros
  • Expect 脚本中 sudo 的问题

    我正在运行以下脚本 usr bin expect f set user lindex argv 0 set pass lindex argv 1 set PATH lindex argv 2 set INV PATH lindex argv
  • EXC_BAD_INSTRUCTION 将 UICollectionView 单元格数据传递给不同的 ViewController 时

    我有一个基于 Firebase 数据填充的 UICollectionView 我创建了填充 UICollectionView 的自定义单元格 import UIKit import Material class PollCell Colle
  • 切换到 .net core 3 端点路由后,身份 UI 不再工作

    在很难让我的区域显示端点路由之后 我设法在这个自我回答的线程中修复它 尽管不是以非常令人满意的方式 从 2 2 迁移到 3 0 后出现问题 默认工作但无法访问区域 是否有办法调试端点分辨率 https stackoverflow com q
  • 版本控制与错误跟踪软件的集成有多重要[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 目前我们使用 FogBugz 来跟踪问题 发现它没问题 我正在寻找其他东西 让最终用户能够与我们一起跟踪他们的案例 以及实际上与电子邮件配合良好
  • 悬停在动画元素上不一致

    我正在使用 css 围绕圆形路径旋转 div 并且我想让它在悬停时改变颜色 请参阅此处的演示 http jsfiddle net gg7tnueu 1 http jsfiddle net gg7tnueu 1 html body heigh
  • Twitter Bootstrap 下拉菜单不起作用

    我知道 Stack Overflow 上有很多类似的问题 我已经查看过它们 但我的下拉菜单仍然不起作用 这是我的代码 div class navbar navbar inverse navbar fixed top div class na
  • 如何制作这个构造函数的深层复制?

    我制作了这个构造函数 我需要对其进行深层复制 我不太明白深拷贝的含义 我知道它会创建一个拥有自己的动态内存的对象的独立副本 但我不明白这样做的需要是什么 我也不确定如何实际实现深层复制 有什么建议么 这是我需要进行深层复制的构造函数 任何人
  • 配置 Mule JPA 模块以使用 Eclipse Link 和 MySQL

    我正在尝试编写一个 Mule ESB 应用程序 它将 XML 文件读入域对象 然后使用 JPA 将该对象写入 MySQL 数据库 我已经弄清楚了大部分所需的配置 但我遇到了一个问题 其中 Mule JPA 模块 https github c
  • 如何在任何情况下保持文本垂直对齐?

    例如 在下图中 我希望在所有条件下保持文本始终垂直对齐 即使文本是一行 两行或三行 意味着文本应始终垂直居中 我不想添加额外的span div img src Hello Stackoverflow Thank you for help m
  • Google Sheets:使用另一个单元格的内容更改单元格的背景颜色

    我有一个如上所述的谷歌表 我在其中以十六进制格式输入颜色代码 然后命名它们 我想使用代码列中的十六进制代码自动更新颜色块列的背景颜色 我尝试过脚本 但 setBackground 函数不起作用 function myFunction var
  • Chrome 扩展程序编程脚本注入错误

    跟进一个上一篇文章 https stackoverflow com questions 58951909 programmatic method to let the user modify the manifest json conten
  • 如何选择不是第一个 tr 也不是最后一个 td

    MyTable tr tr hover background dfdfdf table tr td A td td B td td C td tr tr td 1 td td 2 td td X td tr tr td 3 td td 4
  • 重塑图像数组时感到困惑

    目前我正在尝试运行 ConvNet 随后将输入神经网络的每张图像都存储为列表 但目前该列表是使用三个 for 循环创建的 看一看 im Image open os path join p input directory item pix i
  • mingw32-make 尝试创建子文件夹 .lib 为非法名称

    我正在尝试编译一个需要 freetype 库的项目 所以我正在弄清楚如何将 freetype 安装到 mingw32 更安全的方法是编译它 无论如何 问题是编译 freetype 2 4 11 我进入了msys中提供的bash 我做到了 c
  • 我们如何在基于Dot Net的Azure移动服务中加载相关对象(预加载)?

    如果我有以下模型结构 public class QuestionItem EntityData public string Content get set public bool IsAnswered get set public int
  • 你能有一个指向工会成员的“成员指针”吗?

    我能找到的所有描述都讨论了类上下文中的 指向成员的指针 工会与结构非常相似 特别是也有成员 您也能指点一下这些成员吗 E g union x int a float b int x p x a 我不是在谈论指向整个联合体的指针 作为联合体成
  • 通过 WebSocket 发送 ArrayBuffer 的子段而不进行复制

    我正在填充一个ArrayBuffer与要通过发送的数据WebSocket 数据具有可变大小 因此在序列化时我动态扩展ArrayBuffer如所须 然而 当序列化过程完成时 我经常在缓冲区末尾有未使用的空间 我不想发送这些空间 可以将所需部分