Looks like WebAssembly in Chromium is about 35% faster, but the Javascript engine in Firefox is another 59% faster
99 lines
2.5 KiB
JavaScript
99 lines
2.5 KiB
JavaScript
function alloc_bytes(app, data)
|
|
{
|
|
let stdlib_types___alloc_bytes__ = app.instance.exports['stdlib.types.__alloc_bytes__']
|
|
|
|
if( typeof data == 'string' ) {
|
|
// TODO: Unicode
|
|
data = Uint8Array.from(data.split('').map(x => x.charCodeAt()));
|
|
}
|
|
|
|
let offset = stdlib_types___alloc_bytes__(data.length);
|
|
let i8arr = new Uint8Array(app.instance.exports.memory.buffer, offset + 4, data.length);
|
|
i8arr.set(data);
|
|
|
|
return offset;
|
|
}
|
|
|
|
function run_times(times, callback, tweak)
|
|
{
|
|
let sum = 0;
|
|
let max = 0;
|
|
let min = 1000000000000000000;
|
|
let values = [];
|
|
for(let idx = 0; idx < times; idx += 1) {
|
|
if( tweak ) {
|
|
tweak();
|
|
}
|
|
|
|
const t0 = performance.now();
|
|
let result = callback();
|
|
const t1 = performance.now();
|
|
let time = t1 - t0;
|
|
sum += time;
|
|
values.push({'time': time, 'result': result});
|
|
max = max < time ? time : max;
|
|
min = min > time ? time : min;
|
|
}
|
|
return {
|
|
'min': min,
|
|
'avg': sum / times,
|
|
'max': max,
|
|
'sum': sum,
|
|
'values': values,
|
|
}
|
|
}
|
|
|
|
function test_result(is_pass, data)
|
|
{
|
|
data = data || {};
|
|
|
|
let result_details = document.createElement('details');
|
|
|
|
let result_summary = document.createElement('summary');
|
|
result_summary.textContent =
|
|
(is_pass ? 'Test passed: ' : 'Test failed: ')
|
|
+ (data.summary ?? '(no summary)')
|
|
;
|
|
result_summary.setAttribute('style', is_pass ? 'background: green' : 'background: red');
|
|
result_details.appendChild(result_summary);
|
|
|
|
if( data.attributes ) {
|
|
result_table(data, result_details);
|
|
}
|
|
|
|
let results = document.getElementById('results');
|
|
results.appendChild(result_details);
|
|
}
|
|
|
|
function result_table(attributes, parent)
|
|
{
|
|
let table = document.createElement('table');
|
|
|
|
Object.keys(attributes).forEach(idx => {
|
|
let td0 = document.createElement('td');
|
|
td0.setAttribute('style', 'vertical-align: top;');
|
|
td0.textContent = idx;
|
|
let td1 = document.createElement('td');
|
|
if( typeof(attributes[idx]) == 'object' ) {
|
|
let result_details = document.createElement('details');
|
|
|
|
let result_summary = document.createElement('summary');
|
|
result_summary.textContent = 'Show me';
|
|
result_details.appendChild(result_summary);
|
|
|
|
result_table(attributes[idx], result_details);
|
|
|
|
td1.appendChild(result_details);
|
|
} else {
|
|
td1.textContent = attributes[idx];
|
|
}
|
|
|
|
let tr = document.createElement('tr');
|
|
tr.appendChild(td0);
|
|
tr.appendChild(td1);
|
|
|
|
table.appendChild(tr);
|
|
});
|
|
parent.append(table);
|
|
}
|