When calling a JS function through BridgeJS with String parameters, every String is
- lowered by calling
_swift_js_make_js_string
- which decodes and retains in JS object store (new entry, new ref = 1)
- the object store ref is passed as wasm parameter
- the JS thunk immediately get the object and releases (count--, remove from store)
this is very wasteful, and makes retain the number one bottleneck in current ElementaryUI performance benchmarks.
Example:
@JSFunction func hello(_ v: String) throws
// generates
func _$hello(_ v: String) throws(JSException) -> Void {
let vValue = v.bridgeJSLowerParameter()
bjs_hello(vValue)
if let error = _swift_js_take_exception() {
throw error
}
}
function bjs_hello(v) {
try {
const vObject = swift.memory.getObject(v);
swift.memory.release(v);
imports.hello(vObject);
} catch (error) {
setException(error);
}
}
I suggest:
- passing
String always "in-line" (ie: as address + length) without retaining in the JS memory store
- still support
JSString by-ref to control Swift caller caching (ie: retain once and use same ref multiple times)
When calling a JS function through BridgeJS with
Stringparameters, every String is_swift_js_make_js_stringthis is very wasteful, and makes
retainthe number one bottleneck in current ElementaryUI performance benchmarks.Example:
I suggest:
Stringalways "in-line" (ie: as address + length) without retaining in the JSmemorystoreJSStringby-ref to control Swift caller caching (ie: retain once and use same ref multiple times)