【问题标题】:WebAssembly + WebView + Javascript Interface for heavy calculations?用于繁重计算的 WebAssembly + WebView + Javascript 接口?
【发布时间】:2019-05-22 18:47:28
【问题描述】:

所以我正在开发这个应用程序,它目前是为 web、android 和 ios 原生编写的。这个应用程序在后台做了一些繁重的工作,我们正在寻找改进的方法,但是保持三个基本相同的代码来源很糟糕。

一种方法是用 C++ 创建一个库,然后在应用程序中使用,并通过 WebAssembly 在 Web 上使用。然而,这需要我们生成新版本的 android/apps 并将它们发布到各自的商店。

但后来我认为 WebAssembly 可能适用于所有平台。但是由于我们仍然想在移动平台上提供原生体验,我认为 WebView 可以用于使用 javascript 接口与 WebAssembly 中的库进行通信并以原生方式呈现数据。只需对库进行一次更新,所有应用程序始终拥有最新版本的库。

这是否可行并且仍能提供高性能? webview和javascript界面​​会不会是瓶颈?

【问题讨论】:

  • “但后来我认为 WebAssembly 可能在所有平台上都可用” - 你为什么要这样做? C++ 在 iOS 和 Android 上原生运行。你只需要编译成 WebAssembly 就可以了。
  • @ColinE 我知道,但是:“但这需要我们生成新版本的 android/apps 并将它们发布到各自的商店。”这意味着我想跳过每次更新该库时更新应用程序的部分。

标签: android ios webassembly


【解决方案1】:

据我了解,您拥有原生 Web 应用(HTML + JavaScript)和原生 Android(Java 或 Kotlin)和 iOS(Swift 或 Objective-C)应用。该应用程序做了一些有性能问题的繁重工作 - 我猜这些问题只出现在应用程序的 Web(即 JavaScript)版本中?您想提高此代码的性能,并在所有三个平台上共享它吗?

如果是这样,我认为 WebAssembly 值得考虑。您可以使用 C++ 创建一个库,该库在 iOS 和 Android 中本机运行,并通过 EmScripten 编译为 WebAssembly 以在 Web 上运行。

要记住的一点是,WebAssembly 没有内置的 IO。因此,与您的代码的所有交互都必须跨越 JavaScript / WebAssembly 边界,这确实会产生惩罚。因此,这种方法最适用于具有简单接口的算法,例如他们可能会对少量数据进行大量计算,然后返回结果。

我不确定您为什么考虑在 WebView 中运行它?对于 iOS 和 Android,您不需要使用 WebAssembly - 您可以本地运行 C++ 代码。

【讨论】:

  • 谢谢。我知道这一点,但如果在 android/ios 应用程序中使用 WebAssembly 时仍然具有高性能,那么我将获得每次更新库时不需要更新它们的好处,因为它在 webview 中加载。如果这会显着降低性能,那么本机运行 C++ 库显然是可行的方法。
  • 如果需要快速修复,Android 的更新并不那么痛苦,因为只需几个小时即可通过 Play 商店向所有人提供更新。最近通过 App Store 进行的 iOS 更新有了很大改善,但仍有可能需要更长的时间。
【解决方案2】:

根据您的 C++ 库的功能,这可能是不可能的。

与 Web“Assembly”听起来相反,浏览器中的 WebAssembly 基本上是 JavaScript,因为它由 JS 引擎运行和管理。 Wasm 在 WebView 提供的 JS 上下文中运行。所以用 WebView 来做 JS 和 Wasm 的接口是不正确的。正确的说法是JS也运行Wasm。

这有一个巨大的含义:Wasm 无法访问原生 API,而是 JS API。如果您的 C++ 代码需要文件评估等原生 Android 服务,则不应使用 Wasm。

就性能而言,它还取决于您的 C++ 代码的功能。 Wasm 的性能优势是通过不运行 JS 垃圾收集而不是原生运行来实现的。 Wasm 目前无法运行 GPU、SIMD 或多线程(尽管这些功能将在未来实现,但还没有实现)。

WebAssembly 最大的一点是将 C++/Rust/Go/etc 代码移植到 Web 浏览器,而不是提高性能。

在JS引擎之外还有some efforts to run Wasm in native platforms,但还不成熟,离在原生移动平台上运行还差得很远。

【讨论】:

  • “浏览器中的 WebAssembly 基本上是一种 JavaScript” - 不正确 - WebAssembly 是一种在自己的虚拟机中运行的不同语言。 “Wasm 的性能优势是通过不运行 JS 垃圾收集而不是原生运行来实现的”——严格来说,WebAssembly 的性能提升主要是因为它消除了 JavaScript 遭受的复杂解析/优化/重新优化。
  • “WebAssembly(缩写为 Wasm)是基于堆栈的虚拟机的二进制指令格式”- WebAssembly.org。 Wasm 可以与 JS 互操作,但它不是 JS。您应该在此处更正错误的 stmts 以改进您的答案。干杯。
  • @BumsikKim,Wasm 不在 JS 上下文中运行,它只是可以与 JavaScript 互操作,但那是另一回事。然而,WebAssembly 与普通的汇编语言不同(它仍将在虚拟机上运行),它比 JavaScript 更高效,原因有很多:不仅它不使用垃圾收集,而且 WebAssembly是较低级别的(这意味着对 VM 的抽象较少),它可以访问固定大小的类型(因此允许比您更精通的程序员微调他们的代码),并且如果滥用只会导致代码变慢。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多