mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-06-04 08:31:25 +00:00
Previously the `link_mem_intrinsics` hack actually had a runtime overhead by storing a value into a global location, but it turns out we can actually use a non-inlined function call as part of the *descriptor* which requires this to be in the final binary, but we'll end up snip'ing the value at the end. All in all this should mean that it's not a zero-overhead solution for linking these intrinsics! The `#[wasm_bindgen]` attribute already has other problems if the descriptors don't show up, so that's the least of our issues!
1.7 KiB
1.7 KiB
Small wasm files
View full source code or view the compiled example online
One of wasm-bindgen
's core goals is a pay-only-for-what-you-use philosophy, so
if we don't use much then we shouldn't be paying much! As a result
#[wasm_bindgen]
can generate super-small executables
Currently this code...
{{#include ../../../examples/add/src/lib.rs}}
generates a 710 byte wasm binary:
$ ls -l add_bg.wasm
-rw-rw-r-- 1 alex alex 710 Sep 19 17:32 add_bg.wasm
If you run wasm-opt, a C++ tool for optimize WebAssembly, you can make it even smaller too!
$ wasm-opt -Os add_bg.wasm -o add.wasm
$ ls -l add.wasm
-rw-rw-r-- 1 alex alex 172 Sep 19 17:33 add.wasm
And sure enough, using the wasm2wat tool it's quite small!
$ wasm2wat add.wasm
(module
(type (;0;) (func (param i32 i32) (result i32)))
(func (;0;) (type 0) (param i32 i32) (result i32)
get_local 1
get_local 0
i32.add)
(table (;0;) 1 1 anyfunc)
(memory (;0;) 17)
(global (;0;) i32 (i32.const 1049118))
(global (;1;) i32 (i32.const 1049118))
(export "memory" (memory 0))
(export "__indirect_function_table" (table 0))
(export "__heap_base" (global 0))
(export "__data_end" (global 1))
(export "add" (func 0))
(data (i32.const 1049096) "invalid malloc request"))
Also don't forget to compile in release mode for the smallest binaries! For larger applications you'll likely also want to turn on LTO to generate the smallest binaries:
[profile.release]
lto = true