I was comparing standard JS implementation (https://github.com/dchest/tweetnacl-js) and emscripten-built crypto library.
I was surprised to find that the standard JS implementation was markedly faster than asm.js-assisted implementation. Can someone point to the root cause of this gap / am I missing something? Results: Chrome 52: => 108 => 990 FF 48: => 472 => 1939 -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-discuss+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
const tweetnacl = require('tweetnacl/tweetnacl-fast.js'); const libsodium = require('libsodium/libsodium.js'); function genCurve25519Secret() : Uint8Array { let secret = new Uint8Array(32); crypto.getRandomValues(secret); secret[0] &= 0xF8; secret[31] &= 0x7F; secret[31] |= 0x40; return secret; } function scalarMultBase(n: Uint8Array) : Uint8Array { const nPtr = libsodium._malloc(32); const qPtr = libsodium._malloc(32); libsodium.HEAPU8.set(n, nPtr); libsodium._crypto_scalarmult_base(qPtr, nPtr); const output = new Uint8Array(libsodium.HEAPU8.subarray(qPtr, qPtr + 32)); libsodium._free(qPtr); libsodium._free(nPtr); return output; } function scalarMult(n: Uint8Array, p: Uint8Array) : Uint8Array { const pPtr = libsodium._malloc(32); const nPtr = libsodium._malloc(32); const qPtr = libsodium._malloc(32); libsodium.HEAPU8.set(n, nPtr); libsodium.HEAPU8.set(p, pPtr); libsodium._crypto_scalarmult(qPtr, nPtr, pPtr); const output = new Uint8Array(libsodium.HEAPU8.subarray(qPtr, qPtr + 32)); libsodium._free(qPtr); libsodium._free(nPtr); libsodium._free(pPtr); return output; } function profileCurve25519() { let stopTime = Date.now() + 3000; let count = 0; const a = genCurve25519Secret(); const b = genCurve25519Secret(); const aPub = scalarMultBase(a); while (Date.now() < stopTime) { scalarMult(b, aPub); ++count; } console.log(`=> ${count}`) stopTime = Date.now() + 3000; count = 0; while (Date.now() < stopTime) { tweetnacl.scalarMult(b, aPub); ++count; } console.log(`=> ${count}`) }