【问题标题】:WebAssembly Implicit caching doesn't work on Chrome 75WebAssembly 隐式缓存在 Chrome 75 上不起作用
【发布时间】:2019-11-20 21:20:17
【问题描述】:

我有一个使用 wasm 的工作页面,在 Chrome 上编译需要 5 秒。我正在关注这篇文章:

https://v8.dev/blog/v8-release-75#implicit-caching

关于使缓存在第二次重新加载时工作的隐式缓存。当我每次重新加载页面时需要 5 秒来编译。

我正在使用WebAssembly.instantiateStreaming 来获取获取响应。 使用Chrome DevTool可以看到服务器return 304(但是fetch对象的状态是200

wasm 大小为 3.5 兆,服务器返回正确的 Content-Type 标头:application/wasm

当我使用跟踪时

https://v8.dev/blog/wasm-code-caching#tracing

调试V8 behaviour,我可以看到它写入了缓存v8.wasm.cachedModule,但从未读取它。我没有得到v8.wasm.moduleCacheHit 也没有得到v8.wasm.moduleCacheInvalid 因为每次运行都是冷运行。

启用WebAssembly compiled module cache 无效。

(async () => {
  const fetchPromise = fetch('mybig.wasm');
  const { instance } = await WebAssembly.instantiateStreaming(fetchPromise, importObject);
  console.log(instance);
})();

我没有收到任何错误,一切都按预期工作,但没有缓存。

【问题讨论】:

  • 你启用缓存了吗?..about:flags -> WebAssembly compiled module cache,没有手动启用我相信它只是稳定通道atm的1%。
  • 启用WebAssembly compiled module cache 无效。
  • 出于好奇,您的程序集超过 128 kB,因为目前它不会缓存小于此值。还要确保您的后端发送 application/wasm 作为它的内容类型。
  • 我的程序集是 3.5 兆,是的,服务器返回 application/wasm
  • 抱歉,这里的想法用完了。一切看起来和听起来都应该缓存。在这里疯狂刺伤,在 Chrome 的网络选项卡中,您没有不小心点击disable cache,其他资产似乎可以缓存吗?.. 我认为您可以尝试的唯一其他事情,而不是首先获得 304,尝试将您的服务器标头设置为较长的​​缓存时间,并使用缓存清除进行更新。

标签: javascript google-chrome caching google-chrome-devtools webassembly


【解决方案1】:

这是 chrome 75 中的一个错误。我编译的 web 程序集是 46 兆,它写入了跟踪 v8.wasm.cachedModule 但未能将其实际添加到缓存中。 使用Chrome 77 可以解决这个问题。

https://bugs.chromium.org/p/chromium/issues/detail?id=719172#c63

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2013-10-24
    • 2014-02-12
    • 1970-01-01
    • 2020-09-27
    • 2017-06-10
    相关资源
    最近更新 更多