用于繁重计算的WebAssembly + WebView + Javascript接口?

时间:2019-05-22 07:58:55

标签: android ios webassembly

所以我正在开发这个应用程序,该应用程序目前是为网络,Android和ios本地编写的。这个应用程序在后台进行了一些繁重的工作,我们正在寻找改进的方法,但是保留了基本相同代码的三个源。

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

但是后来我认为WebAssembly可能在所有平台上都可用。但是,由于我们仍然希望在移动平台上提供本机体验,因此我认为WebView可以用于javascript接口,以与WebAssembly中的库进行通信并以本机方式显示数据。库的更新只需执行一次,所有应用程序始终具有库的最新版本。

这是否可能,并且它仍然可以提供高性能? Webview和javascript界面​​会成为瓶颈吗?

2 个答案:

答案 0 :(得分:0)

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

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

这具有很大的含义: Wasm无法访问本机API ,但是可以访问JS API。如果您的C ++代码需要本机Android服务(例如文件评估),则不应该使用Wasm。

就性能而言,这还取决于C ++代码的功能。 Wasm的性能优势是通过不运行JS Garbage Collection而不是通过本地运行来实现的。 Wasm当前无法运行GPU,SIMD或多线程(尽管这些功能将来会推出,但现在还没有)。

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

JS引擎之外还有some efforts to run Wasm in native platforms,但它们还不成熟,距离在本机移动平台上运行还很遥远。

答案 1 :(得分:0)

据我了解,您拥有本机Web应用程序(HTML + JavaScript)和本机Android应用程序(Java或Kotlin)和iOS应用程序(Swift或Objective-C)。该应用程序执行起来有些繁重,但存在性能问题-我猜这些问题仅出现在该应用程序的网络(即JavaScript)版本中吗?您想提高此代码的性能,并在所有三个平台上共享它吗?

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

要记住的一件事是WebAssembly没有内置的IO。因此,与代码的所有交互都必须越过JavaScript / WebAssembly边界,这确实会带来代价。因此,这种方法最适合具有简单界面(例如他们可能会对少量数据执行大量计算,然后返回结果。

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