Note: the results are very different in chromium and firefox.
Link:
Code:
'use strict';
var mem = new WebAssembly.Memory({
initial: 128
});
var data = new Int32Array(mem.buffer);
var reference = data.slice();
for (let i = 0; i < 512; i++) {
crypto.getRandomValues(reference.subarray(i * 16384, (i + 1) * 16384));
}
data.set(reference);
var copy = data.slice();
var sizes = Array.from({length: 16}, (_, i) => 2**(i + 4)).map(e=>({size: e, count:1048576 / e}));
var str = atob('AGFzbQEAAAABBwFgA39/fwACDwEDZW52Bm1lbW9yeQIAAgMDAgAAByECC21lbW9yeV9jb3B5AAAPdjEyOF9sb2FkX3N0b3JlAAEKQAIMACAAIAEgAvwKAAALMQAgASABIAJqIgJJBEADQCAAIAH9AAAA/QsAACAAQRBqIQAgAiABQRBqIgFLDQALCwsAJglwcm9kdWNlcnMBDHByb2Nlc3NlZC1ieQEFY2xhbmcGMTUuMC43AEIPdGFyZ2V0X2ZlYXR1cmVzBCsPbXV0YWJsZS1nbG9iYWxzKwdzaW1kMTI4KwtidWxrLW1lbW9yeSsIc2lnbi1leHQ=');
var buf = new Uint8Array(str.length);
for (let i = 0; i < str.length; i++) {
buf[i] = str.charCodeAt(i);
}
var mod = new WebAssembly.Module(buf);
var ins = new WebAssembly.Instance(mod, {env: {memory:mem}});
var testData = new Uint8Array(mem.buffer);
function runCopyWithin() {
for (let i = 0; i < sizes.length; i++) {
let {count, size} = sizes[i];
let offset = 0;
for (let j = 0; j < count; j++) {
testData.copyWithin(1048576 + offset, offset, offset + size);
offset += size;
}
}
}
function runMemmove() {
for (let i = 0; i < sizes.length; i++) {
let {count, size} = sizes[i];
let offset = 0;
for (let j = 0; j < count; j++) {
ins.exports.memory_copy(1048576 + offset, offset, size);
offset += size;
}
}
}
function runSimdCopy() {
for (let i = 0; i < sizes.length; i++) {
let {count, size} = sizes[i];
let offset = 0;
for (let j = 0; j < count; j++) {
ins.exports.v128_load_store(1048576 + offset, offset, size);
offset += size;
}
}
}