diff options
author | isaacs <i@izs.me> | 2013-05-01 01:50:21 +0400 |
---|---|---|
committer | isaacs <i@izs.me> | 2013-05-14 22:36:04 +0400 |
commit | 201baa273b115350374312ae493d3502d0bf3436 (patch) | |
tree | 8d90190bde98b5c30868474c5c399d6b9608115c /benchmark | |
parent | 6a833a38f6a30c983b93ab272eb31c0799364d94 (diff) |
benchmark: hash stream
Diffstat (limited to 'benchmark')
-rw-r--r-- | benchmark/crypto/cipher-stream.js | 4 | ||||
-rw-r--r-- | benchmark/crypto/hash-stream-creation.js | 86 | ||||
-rw-r--r-- | benchmark/crypto/hash-stream-throughput.js | 77 |
3 files changed, 164 insertions, 3 deletions
diff --git a/benchmark/crypto/cipher-stream.js b/benchmark/crypto/cipher-stream.js index 2a48a7e3f37..4e819893172 100644 --- a/benchmark/crypto/cipher-stream.js +++ b/benchmark/crypto/cipher-stream.js @@ -16,8 +16,6 @@ function main(conf) { api = 'legacy'; } - var dur = conf.dur; - var crypto = require('crypto'); var assert = require('assert'); var alice = crypto.getDiffieHellman('modp5'); @@ -73,7 +71,7 @@ function streamWrite(alice, bob, message, encoding, writes) { bob.on('end', function() { // Gbits var bits = written * 8; - var gbits = written / (1024 * 1024 * 1024); + var gbits = bits / (1024 * 1024 * 1024); bench.end(gbits); }); diff --git a/benchmark/crypto/hash-stream-creation.js b/benchmark/crypto/hash-stream-creation.js new file mode 100644 index 00000000000..a14aa220120 --- /dev/null +++ b/benchmark/crypto/hash-stream-creation.js @@ -0,0 +1,86 @@ +// throughput benchmark +// creates a single hasher, then pushes a bunch of data through it +var common = require('../common.js'); +var crypto = require('crypto'); + +var bench = common.createBenchmark(main, { + writes: [500], + algo: [ 'sha256', 'md5' ], + type: ['asc', 'utf', 'buf'], + out: ['hex', 'binary', 'buffer'], + len: [2, 1024, 102400, 1024 * 1024], + api: ['legacy', 'stream'] +}); + +function main(conf) { + var api = conf.api; + if (api === 'stream' && process.version.match(/^v0\.[0-8]\./)) { + console.error('Crypto streams not available until v0.10'); + // use the legacy, just so that we can compare them. + api = 'legacy'; + } + + var crypto = require('crypto'); + var assert = require('assert'); + + var message; + var encoding; + switch (conf.type) { + case 'asc': + message = new Array(conf.len + 1).join('a'); + encoding = 'ascii'; + break; + case 'utf': + message = new Array(conf.len / 2 + 1).join('ü'); + encoding = 'utf8'; + break; + case 'buf': + message = new Buffer(conf.len); + message.fill('b'); + break; + default: + throw new Error('unknown message type: ' + conf.type); + } + + var fn = api === 'stream' ? streamWrite : legacyWrite; + + bench.start(); + fn(conf.algo, message, encoding, conf.writes, conf.len, conf.out); +} + +function legacyWrite(algo, message, encoding, writes, len, outEnc) { + var written = writes * len; + var bits = written * 8; + var gbits = bits / (1024 * 1024 * 1024); + + while (writes-- > 0) { + var h = crypto.createHash(algo); + h.update(message, encoding); + var res = h.digest(outEnc); + + // include buffer creation costs for older versions + if (outEnc === 'buffer' && typeof res === 'string') + res = new Buffer(res, 'binary'); + } + + bench.end(gbits); +} + +function streamWrite(algo, message, encoding, writes, len, outEnc) { + var written = writes * len; + var bits = written * 8; + var gbits = bits / (1024 * 1024 * 1024); + + while (writes-- > 0) { + var h = crypto.createHash(algo); + + if (outEnc !== 'buffer') + h.setEncoding(outEnc); + + h.write(message, encoding); + h.end(); + h.read(); + } + + bench.end(gbits); +} diff --git a/benchmark/crypto/hash-stream-throughput.js b/benchmark/crypto/hash-stream-throughput.js new file mode 100644 index 00000000000..62a8d45e17d --- /dev/null +++ b/benchmark/crypto/hash-stream-throughput.js @@ -0,0 +1,77 @@ +// throughput benchmark +// creates a single hasher, then pushes a bunch of data through it +var common = require('../common.js'); +var crypto = require('crypto'); + +var bench = common.createBenchmark(main, { + writes: [500], + algo: [ 'sha256', 'md5' ], + type: ['asc', 'utf', 'buf'], + len: [2, 1024, 102400, 1024 * 1024], + api: ['legacy', 'stream'] +}); + +function main(conf) { + var api = conf.api; + if (api === 'stream' && process.version.match(/^v0\.[0-8]\./)) { + console.error('Crypto streams not available until v0.10'); + // use the legacy, just so that we can compare them. + api = 'legacy'; + } + + var crypto = require('crypto'); + var assert = require('assert'); + + var message; + var encoding; + switch (conf.type) { + case 'asc': + message = new Array(conf.len + 1).join('a'); + encoding = 'ascii'; + break; + case 'utf': + message = new Array(conf.len / 2 + 1).join('ü'); + encoding = 'utf8'; + break; + case 'buf': + message = new Buffer(conf.len); + message.fill('b'); + break; + default: + throw new Error('unknown message type: ' + conf.type); + } + + var fn = api === 'stream' ? streamWrite : legacyWrite; + + bench.start(); + fn(conf.algo, message, encoding, conf.writes, conf.len); +} + +function legacyWrite(algo, message, encoding, writes, len) { + var written = writes * len; + var bits = written * 8; + var gbits = bits / (1024 * 1024 * 1024); + var h = crypto.createHash(algo); + + while (writes-- > 0) + h.update(message, encoding); + + h.digest(); + + bench.end(gbits); +} + +function streamWrite(algo, message, encoding, writes, len) { + var written = writes * len; + var bits = written * 8; + var gbits = bits / (1024 * 1024 * 1024); + var h = crypto.createHash(algo); + + while (writes-- > 0) + h.write(message, encoding); + + h.end(); + h.read(); + + bench.end(gbits); +} |