Bun 有一个合并中的 PR,旨在为 JavaScriptCore 添加共享内存线程。
Bun has an open PR adding shared-memory threads to JavaScriptCore

原始链接: https://github.com/oven-sh/WebKit/pull/249

本摘要详细介绍了为降低 JavaScript 引擎执行中“关闭 GIL(全局解释器锁)”所带来的性能损耗而进行的优化工作。通过实施 **H-ISO-TLCSLOT**,团队实现了基于类型的 `IsoSubspace` TLC 插槽解析,从而大幅简化了内存分配流程。 主要改进包括: * **Thin-thunks(轻量存根):** 通过使用 `m_stubCodePtr` 在 JIT 代码中直接进行尾部跳转,系统绕过了繁重的 `saveAllRegisters` 和 C 语言调用开销。这使得 `operationCompileFTLLazySlowPath` 的调用次数减少了 99.9998%。 * **性能提升:** 这些综合优化措施(第 42 和 43 节)将最初的性能损耗从 1912 毫秒降低至 453 毫秒,实现了 **76.3% 的提升**。 * **效率:** 常驻内存(RSS)使用率最高改善了 10.6%,且在测试语料库中保持了稳定的校验和。 **遗留工作:** 剩余约 400-500 毫秒的开销与 `JSArray` 的 iso-TLC 分配有关。目前受限于“任务 8”,该任务需要对 JIT 内联的 butterfly 安装进行标记,以确保在并发环境中安全处理未标记字。

Bun 提交了一项拉取请求(PR),旨在为 JavaScriptCore 增加共享内存线程功能。此举有望大幅提升复杂多线程应用(如用 TypeScript 编写的 SQL 数据库)的性能。 该 PR 借鉴了现有的并发 JavaScript 设计,并在 Hacker News 上引发了热烈讨论。尽管一些开发者对其中的性能潜力和技术可行性感到兴奋,但也有人对 PR 的呈现方式提出了批评。评论的焦点大多集中在该贡献过于庞大的规模(超过 27 万行代码),以及对代码库和随附文档中使用人工智能生成内容的不满。质疑者认为,该 PR 的描述冗长且缺乏清晰的人工撰写说明,引发了对自动化贡献的可维护性和质量的担忧。尽管具备技术前景,但社区对于这种“快闪式”AI 生成 PR 的伦理和实用性仍存在分歧。
相关文章

原文
…unk (76.3% of tax cumulative)

H-ISO-TLCSLOT (IsoSubspace.{h,cpp}, GCThreadLocalCache.cpp,
DFGSpeculativeJIT.cpp, FTLLowerDFGToB3.cpp, AssemblyHelpers.h): per-type
IsoSubspace TLC slot stamped at GCClient::Heap creation;
tlcSlotForConcurrentlyWithIso<T>() resolves via the stamped index. JSArray
EXCLUDED (returns nullopt): JIT inline allocateObject/emitAllocateJSObject
stores butterfly word UNTAGGED -> fresh inline JSArray reads as foreign at
§4.2 ensureLength -> segments on first growth (measured 182,339
convertToSegmentedButterfly + 19M operationArrayPush -> +3,472ms). Under
§42 JSArray cell allocator was always null GIL-off so path went to
operationNewArrayWithSize (TID-tags in C++); §43 iso arm would be FIRST
time JSArray inline path fires GIL-off. Gated on Task-8 (TID-tag every JIT
inline butterfly install). All other iso ClassTypes either no-butterfly
(JSRopeString/JSString) or null-butterfly inline path.

Thin-thunk (FTLThunks.cpp, FTLLazySlowPath.h): gilOff steady state does
the T8 acquire-load m_stubCodePtr IN JIT code, tail-jump if non-null; no
saveAllRegisters/restoreAllRegisters dump, no C call. Null falls through
to today's full thunk.

uprobe: operationCompileFTLLazySlowPath 36.4M -> 56 (-99.9998%).

§43: intcs W=1 7142 -> 6381 (-761); nomap W=1 -1018; default W=1 -976.
Cumulative §42+§43 = 1459ms = 76.3% of original 1912ms tax (now 453ms).
RSS: intcs W=1 -2.3%, W=16 -10.6%. Corpus 94+95/0, identity 40/0, 34/34
checksums stable. Residual: JSArray iso-TLC ~400-500ms gated on Task-8.
联系我们 contact @ memedata.com