【问题标题】:Does Web Worker postMessage benefit from string interning?Web Worker postMessage 是否受益于字符串实习?
【发布时间】:2021-02-25 16:12:00
【问题描述】:

Worker.prototype.postMessage() 可以将 JavaScript 对象发送回 UI 线程。它使用Structured clone algorithm,它能够(例如)保存循环引用。

结构化克隆算法生成的结构是否应用了string interning 优化?当postMessage 将结构发布到主线程时,它是否以保留引用重用的方式发送它?

例如,假设我使用以下消息调用Worker.prototype.postMessage()

postMessage({
  superLongStringThatEnjoysFrequentUse: 'superLongStringThatEnjoysFrequentUse',
  also: [
    'superLongStringThatEnjoysFrequentUse',
    'superLongStringThatEnjoysFrequentUse'
  ]
})

我将为我的超长字符串支付多少次(以字节为单位)?

该字符串总共使用了 4 次。这是否意味着将对一个字符串创建 4 个引用:

  • 在工人堆上
  • 消息传递到 UI 线程时的传输中
  • UI 线程接收到消息时处于静止状态

或者在任何情况下重复使用长字符串会花费我 n * byteLengthOfString 字节?

以防万一:我的目标是现代基于 Chromium 的浏览器。

【问题讨论】:

    标签: javascript v8 web-worker postmessage


    【解决方案1】:

    worker 和主线程肯定至少各有一个副本,因为它们的堆是相互隔离的。消息本身不对字符串使用重复数据删除,因此它将包含多个字符数据副本。接收方稍后可能会申请实习,具体取决于您在那里处理字符串的情况。 (对于发送方或根本不涉及postMessage 的应用程序也是如此 - 并非所有字符串都被实习,因为实习也是有代价的,因此很容易造成您有多个副本的情况相同的字符串。)

    也就是说:所有这些都是实现细节。它很可能会随着时间而改变。所以这个答案将来可能会过时。

    【讨论】:

      猜你喜欢
      • 2013-07-14
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 2011-02-11
      相关资源
      最近更新 更多