mirror of
https://github.com/pezkuwichain/wasm-instrument.git
synced 2026-04-22 04:27:57 +00:00
master
5 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
3ba9c2cfa1 |
Add benchmarks for wasmi builtin metering (#56)
* Upgraded to newest wasmi
* Refactored benchmarks
* Two new benchmark strategies (`no_metering` and `wasmi_builtin`)
We can now benchmark the execution of modules using our two
instrumentation strategies in addition to no metering (as a baseline)
and wasmi's builtin metering.
We can learn from the following results (ran on my M1) that the builtin
metering decisively outperforms the instrumentation on every single
fixture.
cc @Robbepop
```
coremark/no_metering [15.586 s 15.588 s 15.589 s]
coremark/wasmi_builtin [16.403 s 16.414 s 16.434 s]
coremark/host_function [18.245 s 18.248 s 18.252 s]
coremark/mutable_global [20.476 s 20.486 s 20.505 s]
recursive_ok/no_metering [111.32 µs 111.33 µs 111.34 µs]
recursive_ok/wasmi_builtin [138.64 µs 138.65 µs 138.66 µs]
recursive_ok/host_function [495.55 µs 495.64 µs 495.78 µs]
recursive_ok/mutable_global [514.07 µs 514.09 µs 514.11 µs]
fibonacci_recursive/no_metering [3.9098 µs 3.9102 µs 3.9108 µs]
fibonacci_recursive/wasmi_builtin [4.3242 µs 4.3246 µs 4.3250 µs]
fibonacci_recursive/host_function [12.913 µs 12.914 µs 12.915 µs]
fibonacci_recursive/mutable_global [13.202 µs 13.208 µs 13.212 µs]
factorial_recursive/no_metering [530.72 ns 530.84 ns 530.91 ns]
factorial_recursive/wasmi_builtin [619.17 ns 619.30 ns 619.44 ns]
factorial_recursive/host_function [1.7656 µs 1.7657 µs 1.7659 µs]
factorial_recursive/mutable_global [1.8783 µs 1.8786 µs 1.8788 µs]
count_until/no_metering [1.2422 ms 1.2423 ms 1.2424 ms]
count_until/wasmi_builtin [1.3976 ms 1.3978 ms 1.3981 ms]
count_until/host_function [4.8074 ms 4.8106 ms 4.8125 ms]
count_until/mutable_global [5.9161 ms 5.9169 ms 5.9182 ms]
memory_vec_add/no_metering [4.1630 ms 4.1638 ms 4.1648 ms]
memory_vec_add/wasmi_builtin [4.3913 ms 4.3925 ms 4.3930 ms]
memory_vec_add/host_function [8.2925 ms 8.2949 ms 8.2967 ms]
memory_vec_add/mutable_global [9.1124 ms 9.1152 ms 9.1163 ms]
wasm_kernel::tiny_keccak/no_metering [613.21 µs 613.42 µs 613.58 µs]
wasm_kernel::tiny_keccak/wasmi_builtin [617.04 µs 617.46 µs 617.81 µs]
wasm_kernel::tiny_keccak/host_function [817.24 µs 817.44 µs 817.89 µs]
wasm_kernel::tiny_keccak/mutable_global [873.42 µs 873.90 µs 874.65 µs]
global_bump/no_metering [1.4597 ms 1.4598 ms 1.4600 ms]
global_bump/wasmi_builtin [1.6151 ms 1.6152 ms 1.6153 ms]
global_bump/host_function [5.5393 ms 5.5418 ms 5.5435 ms]
global_bump/mutable_global [6.9446 ms 6.9454 ms 6.9461 ms]
```
|
||
|
|
54213f77f6 |
Update wasmi requirement from 0.20 to 0.21 (#42)
Updates the requirements on [wasmi](https://github.com/paritytech/wasmi) to permit the latest version. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/paritytech/wasmi/releases">wasmi's releases</a>.</em></p> <blockquote> <h2>v0.21.0 - 2023-01-04</h2> <h3>Added</h3> <ul> <li>Add support for resumable function calls. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/598">paritytech/wasmi#598</a>) <ul> <li>This feature allows to resume a function call upon encountering a host trap.</li> </ul> </li> <li>Add support for concurrently running function executions using a single <code>wasmi</code> engine. <ul> <li>This feature also allows to call Wasm functions from host functions. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/590">paritytech/wasmi#590</a>)</li> </ul> </li> <li>Add initial naive WASI support for <code>wasmi</code> using the new <code>wasmi_wasi</code> crate. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/557">paritytech/wasmi#557</a>) <ul> <li>Special thanks to <a href="https://github.com/OLUWAMUYIWA">Onigbinde Oluwamuyiwa Elijah</a> for carrying the WASI support efforts!</li> <li>Also thanks to <a href="https://github.com/Berrysoft">Yuyi Wang</a> for testing and improving initial WASI support. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/592">paritytech/wasmi#592</a>, <a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/571">paritytech/wasmi#571</a>, <a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/568">paritytech/wasmi#568</a>)</li> <li><strong>Note:</strong> There is ongoing work to integrate WASI support in <code>wasmi_cli</code> so that the <code>wasmi</code> CLI will then be able to execute arbitrary <code>wasm-wasi</code> files out of the box in the future.</li> </ul> </li> <li>Add <code>Module::imports</code> that allows to query Wasm module imports. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/573">paritytech/wasmi#573</a>, <a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/583">paritytech/wasmi#583</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Fix a bug that imported linear memories and tables were initialized twice upon instantiation. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/593">paritytech/wasmi#593</a>)</li> <li>The <code>wasmi</code> CLI now properly hints for file path arguments. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/596">paritytech/wasmi#596</a>)</li> </ul> <h3>Changed</h3> <ul> <li>The <code>wasmi::Trap</code> type is now more similar to Wasmtime's <code>Trap</code> type. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/559">paritytech/wasmi#559</a>)</li> <li>The <code>wasmi::Store</code> type is now <code>Send</code> and <code>Sync</code> as intended. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/566">paritytech/wasmi#566</a>)</li> <li>The <code>wasmi</code> CLI now prints exported functions names if the function name CLI argument is missing. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/579">paritytech/wasmi#579</a>)</li> <li>Improve feedback when running a Wasm module without exported function using <code>wasmi</code> CLI. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/584">paritytech/wasmi#584</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/paritytech/wasmi/blob/master/CHANGELOG.md">wasmi's changelog</a>.</em></p> <blockquote> <h2>[0.21.0] - 2023-01-04</h2> <h3>Added</h3> <ul> <li>Add support for resumable function calls. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/598">paritytech/wasmi#598</a>) <ul> <li>This feature allows to resume a function call upon encountering a host trap.</li> </ul> </li> <li>Add support for concurrently running function executions using a single <code>wasmi</code> engine. <ul> <li>This feature also allows to call Wasm functions from host functions. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/590">paritytech/wasmi#590</a>)</li> </ul> </li> <li>Add initial naive WASI support for <code>wasmi</code> using the new <code>wasmi_wasi</code> crate. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/557">paritytech/wasmi#557</a>) <ul> <li>Special thanks to <a href="https://github.com/OLUWAMUYIWA">Onigbinde Oluwamuyiwa Elijah</a> for carrying the WASI support efforts!</li> <li>Also thanks to <a href="https://github.com/Berrysoft">Yuyi Wang</a> for testing and improving initial WASI support. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/592">paritytech/wasmi#592</a>, <a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/571">paritytech/wasmi#571</a>, <a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/568">paritytech/wasmi#568</a>)</li> <li><strong>Note:</strong> There is ongoing work to integrate WASI support in <code>wasmi_cli</code> so that the <code>wasmi</code> CLI will then be able to execute arbitrary <code>wasm-wasi</code> files out of the box in the future.</li> </ul> </li> <li>Add <code>Module::imports</code> that allows to query Wasm module imports. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/573">paritytech/wasmi#573</a>, <a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/583">paritytech/wasmi#583</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Fix a bug that imported linear memories and tables were initialized twice upon instantiation. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/593">paritytech/wasmi#593</a>)</li> <li>The <code>wasmi</code> CLI now properly hints for file path arguments. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/596">paritytech/wasmi#596</a>)</li> </ul> <h3>Changed</h3> <ul> <li>The <code>wasmi::Trap</code> type is now more similar to Wasmtime's <code>Trap</code> type. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/559">paritytech/wasmi#559</a>)</li> <li>The <code>wasmi::Store</code> type is now <code>Send</code> and <code>Sync</code> as intended. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/566">paritytech/wasmi#566</a>)</li> <li>The <code>wasmi</code> CLI now prints exported functions names if the function name CLI argument is missing. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/579">paritytech/wasmi#579</a>)</li> <li>Improve feedback when running a Wasm module without exported function using <code>wasmi</code> CLI. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/584">paritytech/wasmi#584</a>)</li> </ul> <h2>[0.20.0] - 2022-11-04</h2> <h3>Added</h3> <ul> <li>Contribution documentation about fuzz testing. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/529">paritytech/wasmi#529</a>)</li> </ul> <h3>Removed</h3> <ul> <li>Removed some deprecated functions in the <code>wasmi_core</code> crate. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/545">paritytech/wasmi#545</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Fixed a critical performance regression introduced in Rust 1.65. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/518">paritytech/wasmi#518</a>) <ul> <li>While the PR's main job was to clean up some code it was found out that it also fixes a critical performance regression introduced in Rust 1.65.</li> <li>You can read more about this performance regression <a href="https://github-redirect.dependabot.com/rust-lang/rust/issues/102952">in this thread</a>.</li> </ul> </li> </ul> <h3>Changed</h3> <ul> <li>Fixed handling of edge cases with respect to Wasm linear memory. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/449">paritytech/wasmi#449</a>) <ul> <li>This allows for <code>wasmi</code> to properly setup and use linear memory instances of up to 4GB.</li> </ul> </li> <li>Optimize and improve Wasm instantiation. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/531">paritytech/wasmi#531</a>)</li> <li>Optimize <code>global.get</code> of immutable non-imported globals. (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/pull/533">paritytech/wasmi#533</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/paritytech/wasmi/commit/9e228e8a253074bf25cfcfeff11b07ff2033170e"><code>9e228e8</code></a> Bump <code>wasmi</code> version to <code>0.21.0</code> (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/issues/604">#604</a>)</li> <li><a href="https://github.com/paritytech/wasmi/commit/8fb3a58de76a10b0072d0c71fd1677a96f33009f"><code>8fb3a58</code></a> Prepare for <code>wasmi</code> version <code>0.21.0</code> release (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/issues/603">#603</a>)</li> <li><a href="https://github.com/paritytech/wasmi/commit/829ae5b115e8d8f484c93798309ac9e1eb7351eb"><code>829ae5b</code></a> Resumable Function Calls (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/issues/598">#598</a>)</li> <li><a href="https://github.com/paritytech/wasmi/commit/3c62031d096a73c59edb05ea5cc508e5bc65b0f6"><code>3c62031</code></a> Add <code>res: EngineResources</code> field to <code>EngineExecutor</code> (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/issues/602">#602</a>)</li> <li><a href="https://github.com/paritytech/wasmi/commit/bbcfc21deea430f82aac6c268ffea61587173060"><code>bbcfc21</code></a> Refactor <code>Engine</code> internals (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/issues/601">#601</a>)</li> <li><a href="https://github.com/paritytech/wasmi/commit/3186c023210a537d0fd70517942a1ebd0c5ad3f7"><code>3186c02</code></a> Return <code>()</code> from <code>CallResults</code> for slices (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/issues/600">#600</a>)</li> <li><a href="https://github.com/paritytech/wasmi/commit/8965c9af96beb189919c0a2aa306a8ae111141ad"><code>8965c9a</code></a> Refactor FuncType verification (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/issues/599">#599</a>)</li> <li><a href="https://github.com/paritytech/wasmi/commit/2b5a48618fa9acb1d36e91ba9325623d6858e0e6"><code>2b5a486</code></a> CLI: Improve CLI parsing (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/issues/596">#596</a>)</li> <li><a href="https://github.com/paritytech/wasmi/commit/da8e4a694054ea218b316c31f28aae5494a42119"><code>da8e4a6</code></a> Allow host functions to call Wasm functions (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/issues/590">#590</a>)</li> <li><a href="https://github.com/paritytech/wasmi/commit/f82ed77000b520046918b4e75cd733a2a7650d5b"><code>f82ed77</code></a> Fix duplicated imported linear memories and tables (<a href="https://github-redirect.dependabot.com/paritytech/wasmi/issues/593">#593</a>)</li> <li>Additional commits viewable in <a href="https://github.com/paritytech/wasmi/compare/v0.20.0...v0.21.0">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alexander Theißen <alex.theissen@me.com> |
||
|
|
a4dde28607 |
Add new gas metering method: mutable global + local gas function (#34)
* fix misprints in doc comments * added global gas tracker variable and local gas fn * all exported functions of the module to accept a new param and to set the gas_left global to its value at their very start * make module support both gas metering methods * tests fixed for the old metering method * better naming * MutableGlobal metering method implemented, tests for the old method pass * gas_metering::tests updated and pass * all tests udpdated and pass * emacs backup files to .gitignore * docs updated * clippy fix * iff = if and only if * more clippy * docs misprints fixes * refactored to have Backend trait and two implementations in separate sub-modules * docs updated * fixed old benches (updating them is coming next) * added bench for an instrumented wasm-coremark * updated benches: added them for both gas_metering instrumentations * benches contest first ver * added debug prints to the bench * refactored to better fit frontend-backend pattern * docs update * updated benches * design updated on feedback * re-structured sub-modules re-structured sub-modules & updated docs * docs improved * addressed latest feedback comments * re-writed the local gas function * coremark benches show ~20% performance improvement * fix ci: test + clippy * save before re-factoring prepare_in_wasm() * bare_call_16 shows 16% worse perf * + fibonacci recursive bench * refactored benchmarks * + factorial recursive bench * benches on wasmi fixtures show no perf improvement, coremark runs ~20% faster being instrumented with mutable_global gas metering * charge gas for local gas func isntructions execution * replaced benchmark which requires multi_value feature * save: optimized gas func a bit (benches work, fixture tests fail) * 1033% overhead on many_blocks.wasm when mut_global gas_metering together with stack_height * size overhead test for both gas metering methods + stack limiter * added more benches * improved print_size_overhead test * test for comparing size overheads of two gas_metering injectors * before optimization: benches + size overhead * optimization try-1: inline part of gas func instructions: +benches +size overheads * optimization try-2: inline hot path of gas fn: +benches +size overheads * opt try-3: count for gas fn cost on the caller side: +benches +size overhead * revert to initial version but with static gas fn cost on the caller side: +benches +sizes * tests fixed * use newest wasmi 0.20: +benches +docs updated * use if-else block instead of Return: +benches * fix tests * clippy fix * addressed review comments * Update changelog Co-authored-by: Alexander Theißen <alex.theissen@me.com> |
||
|
|
ff68bee449 | We should use bench_with_input so that a blackbox is used | ||
|
|
8291876394 |
Add benchmarks and add tiny performance improvements (#6)
* Add some benchmarks * Replace extend -> extend_from_slice (1-2% performance improvement) * Add many_blocks benchmarks |