Benchmarking memory copy in js/wasm

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;
        }
    }
}
3 Likes