Web Worker postMessage 是否受益于字符串实习?
Does Web Worker postMessage benefit from string interning?
Worker.prototype.postMessage()
can send JavaScript objects back to the UI thread. It employs a Structured clone algorithm,能够(例如)保留循环引用。
结构化克隆算法生成的结构是否应用了 string interning 优化?当 postMessage
将结构发布到主线程时,它是否以保留引用重用的方式发送它?
例如,假设我使用以下消息调用 Worker.prototype.postMessage()
:
postMessage({
superLongStringThatEnjoysFrequentUse: 'superLongStringThatEnjoysFrequentUse',
also: [
'superLongStringThatEnjoysFrequentUse',
'superLongStringThatEnjoysFrequentUse'
]
})
我要为我的超长字符串支付多少次价格(以字节为单位)?
该字符串总共使用了4次。这是否意味着将对一个字符串创建 4 个引用:
- 在工人堆上
- 消息传递到 UI 线程时正在传输中
- 当消息被 UI 线程接收时处于静止状态
或者是否存在重新使用长字符串会花费我 n * byteLengthOfString
字节的情况?
以防万一:我的目标是基于现代 Chromium 的浏览器。
worker和主线程肯定至少各有一份,因为他们的堆是相互隔离的。消息本身并没有对字符串进行去重,所以会包含多份字符数据。接收方稍后可能会申请实习,具体取决于您对那里的字符串的处理方式。 (发送方或根本不涉及 postMessage
的应用程序也是如此——并非所有字符串都被保留,因为保留也是有代价的,所以很容易造成你有的情况同一个字符串的几个副本。)
就是说:所有这些都是实现细节。它很可能会随着时间而改变。所以这个答案将来可能会过时。
Worker.prototype.postMessage()
can send JavaScript objects back to the UI thread. It employs a Structured clone algorithm,能够(例如)保留循环引用。
结构化克隆算法生成的结构是否应用了 string interning 优化?当 postMessage
将结构发布到主线程时,它是否以保留引用重用的方式发送它?
例如,假设我使用以下消息调用 Worker.prototype.postMessage()
:
postMessage({
superLongStringThatEnjoysFrequentUse: 'superLongStringThatEnjoysFrequentUse',
also: [
'superLongStringThatEnjoysFrequentUse',
'superLongStringThatEnjoysFrequentUse'
]
})
我要为我的超长字符串支付多少次价格(以字节为单位)?
该字符串总共使用了4次。这是否意味着将对一个字符串创建 4 个引用:
- 在工人堆上
- 消息传递到 UI 线程时正在传输中
- 当消息被 UI 线程接收时处于静止状态
或者是否存在重新使用长字符串会花费我 n * byteLengthOfString
字节的情况?
以防万一:我的目标是基于现代 Chromium 的浏览器。
worker和主线程肯定至少各有一份,因为他们的堆是相互隔离的。消息本身并没有对字符串进行去重,所以会包含多份字符数据。接收方稍后可能会申请实习,具体取决于您对那里的字符串的处理方式。 (发送方或根本不涉及 postMessage
的应用程序也是如此——并非所有字符串都被保留,因为保留也是有代价的,所以很容易造成你有的情况同一个字符串的几个副本。)
就是说:所有这些都是实现细节。它很可能会随着时间而改变。所以这个答案将来可能会过时。