Skip to content

Instantly share code, notes, and snippets.

@mafintosh
Last active June 10, 2017 04:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mafintosh/7010f565f9eda65d85c366764d9a5ef3 to your computer and use it in GitHub Desktop.
Save mafintosh/7010f565f9eda65d85c366764d9a5ef3 to your computer and use it in GitHub Desktop.
if (!process.browser) var sodium = require('sodium-native')
var blake2b = require('blake2b')
var blake2bw = require('blake2b-wasm')
var BLAKE2s = require('blake2s-js')
var crypto = require('crypto')
var DATA_64KB = Buffer.alloc(65536)
var DATA_4KB = Buffer.alloc(4096)
var DATA_128B = Buffer.alloc(128)
blake2bw.ready(function (err) {
if (err) throw new Error('WASM not supported')
run('blake2s, 64kb', hashBlake2s, DATA_64KB, 10000)
run('blake2b, 64kb', hashBlake2b, DATA_64KB, 10000)
run('blake2b-wasm, 64kb', hashBlake2bWasm, DATA_64KB, 10000)
if (!process.browser) run('sodium-native.generichash, 64kb', hashBlake2bSodium, DATA_64KB, 10000)
run('sha256, 64kb', hashSha256, DATA_64KB, 10000)
run('blake2s, 4kb', hashBlake2s, DATA_4KB, 10000)
run('blake2b, 4kb', hashBlake2b, DATA_4KB, 10000)
run('blake2b-wasm, 4kb', hashBlake2bWasm, DATA_4KB, 10000)
if (!process.browser) run('sodium-native.generichash, 4kb', hashBlake2bSodium, DATA_4KB, 10000)
run('sha256, 4kb', hashSha256, DATA_4KB, 10000)
run('blake2s, 128b', hashBlake2s, DATA_128B, 10000)
run('blake2b, 128b', hashBlake2b, DATA_128B, 10000)
run('blake2b-wasm, 128b', hashBlake2bWasm, DATA_128B, 10000)
if (!process.browser) run('sodium-native.generichash, 128b', hashBlake2bSodium, DATA_128B, 10000)
run('sha256, 128b', hashSha256, DATA_128B, 10000)
})
function run (name, hash, data, runs) {
console.log('Running bench: ' + name + ' (' + runs + ' runs)')
var then = Date.now()
for (var i = 0; i < runs; i++) {
hash(data)
}
var delta = Date.now() - then
console.log('Benchmark took ' + delta + 'ms, ' + Math.round(1000 * runs / delta) + ' hashes/s')
console.log()
}
function hashBlake2s (input) {
var hash = new BLAKE2s(32)
hash.update(input)
return hash.digest()
}
function hashBlake2b (input) {
var out = new Buffer(32)
blake2b(out, input)
return out
}
function hashBlake2bWasm (input) {
return blake2bw().update(input).digest()
}
function hashBlake2bSodium (input) {
var out = new Buffer(32)
sodium.crypto_generichash(out, input)
return out
}
function hashSha256 (input) {
return crypto.createHash('sha256').update(input).digest()
}
Running bench: blake2s, 64kb (10000 runs)
Benchmark took 4329ms, 2310 hashes/s
Running bench: blake2b, 64kb (10000 runs)
Benchmark took 54959ms, 182 hashes/s
Running bench: blake2b-wasm, 64kb (10000 runs)
Benchmark took 3413ms, 2930 hashes/s
Running bench: sha256, 64kb (10000 runs)
Benchmark took 18201ms, 549 hashes/s
Running bench: blake2s, 4kb (10000 runs)
Benchmark took 374ms, 26738 hashes/s
Running bench: blake2b, 4kb (10000 runs)
Benchmark took 3329ms, 3004 hashes/s
Running bench: blake2b-wasm, 4kb (10000 runs)
Benchmark took 227ms, 44053 hashes/s
Running bench: sha256, 4kb (10000 runs)
Benchmark took 1285ms, 7782 hashes/s
Running bench: blake2s, 128b (10000 runs)
Benchmark took 122ms, 81967 hashes/s
Running bench: blake2b, 128b (10000 runs)
Benchmark took 108ms, 92593 hashes/s
Running bench: blake2b-wasm, 128b (10000 runs)
Benchmark took 21ms, 476190 hashes/s
Running bench: sha256, 128b (10000 runs)
Benchmark took 183ms, 54645 hashes/s
Running bench: blake2s, 64kb (10000 runs)
Benchmark took 4272ms, 2341 hashes/s
Running bench: blake2b, 64kb (10000 runs)
Benchmark took 55845ms, 179 hashes/s
Running bench: blake2b-wasm, 64kb (10000 runs)
Benchmark took 3821ms, 2617 hashes/s
Running bench: sodium-native.generichash, 64kb (10000 runs)
Benchmark took 1114ms, 8977 hashes/s
Running bench: sha256, 64kb (10000 runs)
Benchmark took 2259ms, 4427 hashes/s
Running bench: blake2s, 4kb (10000 runs)
Benchmark took 348ms, 28736 hashes/s
Running bench: blake2b, 4kb (10000 runs)
Benchmark took 3535ms, 2829 hashes/s
Running bench: blake2b-wasm, 4kb (10000 runs)
Benchmark took 319ms, 31348 hashes/s
Running bench: sodium-native.generichash, 4kb (10000 runs)
Benchmark took 92ms, 108696 hashes/s
Running bench: sha256, 4kb (10000 runs)
Benchmark took 175ms, 57143 hashes/s
Running bench: blake2s, 128b (10000 runs)
Benchmark took 87ms, 114943 hashes/s
Running bench: blake2b, 128b (10000 runs)
Benchmark took 167ms, 59880 hashes/s
Running bench: blake2b-wasm, 128b (10000 runs)
Benchmark took 59ms, 169492 hashes/s
Running bench: sodium-native.generichash, 128b (10000 runs)
Benchmark took 13ms, 769231 hashes/s
Running bench: sha256, 128b (10000 runs)
Benchmark took 36ms, 277778 hashes/s
@ebdrup
Copy link

ebdrup commented Jun 9, 2017

This is very cool. Gotta switch to node8 soon :-)
The node module benchmark https://benchmarkjs.com/ I great for these kind of benchmarks, runs the shortest amount of time to get statistically significant results and shows uncertainty of result.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment