wasm-bindgen/benchmarks/index.html
2019-05-06 11:57:38 -07:00

296 lines
8.9 KiB
HTML

<html>
<head>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type"/>
<style>
body {
max-width: 1000px;
margin: 0 auto;
}
thead td {
font-weight: bold;
}
table td {
border: 1px solid black;
padding: 10px;
}
.about {
display: none;
}
</style>
<script src='index.js' type=module async></script>
</head>
<body>
<a href='https://github.com/rustwasm/wasm-bindgen/tree/master/benchmarks'>Source code</a>
<h1>JS / wasm-bindgen comparison</h1>
<p>
These benchmarks are meant to compare WebAssembly costs using raw wasm
files and wasm-bindgen itself against the JS equivalents. These
microbenchmarks aren't really representative of WebAssembly performance,
but can be useful data points about how expensive it is to cross
boundaries for example.
</p>
<p>
For all benchmarks higher numbers are better numbers.
</p>
<table id='js-vs-wasm-bindgen'>
<thead>
<tr>
<td>Benchmark</td>
<td>wasm-bindgen</td>
<td>JS</td>
<td><code>*.wast</code></td>
</tr>
</thead>
<tbody>
<tr>
<td>
Call a thunk
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This benchmarks tests out how long it take JS to call a thunk in
the given language. For example JS will call a JS thunk or
JS will call a wasm function that does nothing.
</p>
</td>
<td class='bm' id='wbindgen_thunk'></td>
<td class='bm' id='js_thunk'></td>
<td class='bm' id='raw_thunk'></td>
</tr>
<tr>
<td>
Call an adder
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This benchmarks tests out how long it take JS to call a function
in the target language which adds two numbers and returns the
result. This is likely to be similar to the previous benchmark
in terms of results, but it's thought that some extra computation
may show overheads differently.
</p>
</td>
<td class='bm' id='wbindgen_thunk'></td>
<td class='bm' id='js_thunk'></td>
<td class='bm' id='raw_thunk'></td>
</tr>
<td>
Call a JS thunk
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This benchmarks tests out how long it takes to call a JS function
10,000 times. Each language/framework has a function which takes a
parameter of how many times to call an imported JS function.
Remember that JS itself benefits from inlining, where as JS cannot
be inlined into WebAssembly. In these cases the imported function
performs no work, it just returns immediately.
</p>
</td>
<td class='bm' id='wbindgen_call_js_thunk_n_times'></td>
<td class='bm' id='js_call_js_thunk_n_times'></td>
<td class='bm' id='raw_call_js_thunk_n_times'></td>
</tr>
<tr>
<td>
Call a JS function which adds
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This benchmark is similar to the previous thunk benchmark except
that this time the imported function will add its two arguments
and returns the result. This helps measure the overhead of
sending data like integers back and forth.
</p>
</td>
<td class='bm' id='wbindgen_call_js_add_n_times'></td>
<td class='bm' id='js_call_js_add_n_times'></td>
<td class='bm' id='raw_call_js_add_n_times'></td>
</tr>
<tr>
<td>
Calculate Fib(40)
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This benchmarks calculates the 40th fibonacci number. It in
theory should favor wasm since wasm is "better a compute", but
a good JIT will probably make the code roughly equivalent.
</p>
</td>
<td class='bm' id='wbindgen_fib_40'></td>
<td class='bm' id='js_fib_40'></td>
</tr>
<tr>
<td>
Access <code>Node.firstChild</code>
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This benchmark attempts to see the cost of accessing a DOM
property from both JS and WebAssembly. We access the DOM property
as fast as possible in WebAssembly and otherwise just access it
as a normal property in JS.
</p>
</td>
<td class='bm' id='wbindgen_call_node_first_child_n_times'></td>
<td class='bm' id='js_call_node_first_child_n_times'></td>
</tr>
<tr>
<td>
Access <code>Node.nodeType</code>
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This benchmark attempts to see the cost of accessing a DOM
property from both JS and WebAssembly. We access the DOM property
as fast as possible in WebAssembly and otherwise just access it
as a normal property in JS.
</p>
</td>
<td class='bm' id='wbindgen_call_node_node_type_n_times'></td>
<td class='bm' id='js_call_node_node_type_n_times'></td>
</tr>
<tr>
<td>
Count types of nodes on a page
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This is intended to be a "flavorful DOM benchmark" which
exercises DOM functionality from WebAssembly, specifically
counting the number of types of each node on a page.
</p>
</td>
<td class='bm' id='wbindgen_count_node_types'></td>
<td class='bm' id='js_count_node_types'></td>
</tr>
</tbody>
</table>
<h1>wasm-bindgen benchmarks</h1>
<p>
These benchmarks don't compare against JS but are instead more intended
to be compared against each other, across browsers, or across versions of
wasm-bindgen.
</p>
<table id='js-vs-wasm-bindgen'>
<thead>
<tr>
<td>Benchmark</td>
<td>Result</td>
</tr>
</thead>
<tbody id='wbindgen-body'>
<tr>
<td>
Access <code>Node.nodeType</code> with <code>final</code>
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This is similar to the <code>Node.nodeType</code> benchmark above
except that it uses the <code>final</code> attribute in
wasm-bindgen.
</p>
</td>
<td class='bm' id='wbindgen_call_first_child_final_n_times'></td>
</tr>
<tr>
<td>
Access <code>Node.nodeType</code> with <code>structural</code>
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This is similar to the <code>Node.nodeType</code> benchmark above
except that it uses the <code>structural</code> attribute in
wasm-bindgen.
</p>
</td>
<td class='bm' id='wbindgen_call_first_child_structural_n_times'></td>
</tr>
<tr>
<td>
Call a custom JS class <code>Foo.bar</code> method with
<code>final</code>
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This is similar to the <code>Node.nodeType</code> benchmark above
except that it's not calling a DOM method but rather a custom JS
class's method.
</p>
</td>
<td class='bm' id='wbindgen_call_foo_bar_final_n_times'></td>
</tr>
<tr>
<td>
Call a custom JS class <code>Foo.bar</code> method with
<code>structural</code>
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This is similar to the <code>Node.nodeType</code> benchmark above
except that it's not calling a DOM method but rather a custom JS
class's method.
</p>
</td>
<td class='bm' id='wbindgen_call_foo_bar_structural_n_times'></td>
</tr>
<tr style='display:none' class='str-benchmark'>
<td>
Pass <span class='str'></span> to/from wasm-bindgen
<a class='about-open' href='#'>(?)</a>
<p class='about'>
This benchmarks the overhead of passing strings to wasm and
also receiving them from wasm.
</p>
</td>
<td class='bm'></td>
</tr>
</tbody>
</table>
</body>
</html>