From f3d5efa3ee4432121f6e2a1866f1179b09056594 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Wed, 8 Jun 2016 15:47:18 -0700 Subject: tls: avoid calling Buffer.byteLength multiple times There's no reason to be calling Buffer.byteLength() twice. Small perf improvement Run 1: tls/convertprotocols.js n=1 v6.2.1 = 11852, new = 12204 ...... -2.89% tls/convertprotocols.js n=50000 v6.2.1 = 515660, new = 570610 ..... -9.63% Run 2: tls/convertprotocols.js n=1 v6.2.1 = 11729, new = 12045 ...... -2.62% tls/convertprotocols.js n=50000 v6.2.1 = 512080, new = 637730 ..... -19.70% PR-URL: https://github.com/nodejs/node/pull/7236 Reviewed-By: Fedor Indutny --- benchmark/tls/convertprotocols.js | 20 ++++++++++++++++++++ lib/tls.js | 20 +++++++++++--------- 2 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 benchmark/tls/convertprotocols.js diff --git a/benchmark/tls/convertprotocols.js b/benchmark/tls/convertprotocols.js new file mode 100644 index 0000000000..32da0fe6fd --- /dev/null +++ b/benchmark/tls/convertprotocols.js @@ -0,0 +1,20 @@ +'use strict'; + +const common = require('../common.js'); +const tls = require('tls'); + +const bench = common.createBenchmark(main, { + n: [1, 50000] +}); + +function main(conf) { + const n = +conf.n; + + var i = 0; + var m = {}; + common.v8ForceOptimization( + tls.convertNPNProtocols, ['ABC', 'XYZ123', 'FOO'], m); + bench.start(); + for (; i < n; i++) tls.convertNPNProtocols(['ABC', 'XYZ123', 'FOO'], m); + bench.end(n); +} diff --git a/lib/tls.js b/lib/tls.js index 695edd8c5a..849daeb07f 100644 --- a/lib/tls.js +++ b/lib/tls.js @@ -29,17 +29,19 @@ exports.getCiphers = internalUtil.cachedResult(() => { // Convert protocols array into valid OpenSSL protocols list // ("\x06spdy/2\x08http/1.1\x08http/1.0") function convertProtocols(protocols) { - var buff = Buffer.allocUnsafe(protocols.reduce(function(p, c) { - return p + 1 + Buffer.byteLength(c); + const lens = Array(protocols.length); + const buff = Buffer.allocUnsafe(protocols.reduce((p, c, i) => { + var len = Buffer.byteLength(c); + lens[i] = len; + return p + 1 + len; }, 0)); - protocols.reduce(function(offset, c) { - var clen = Buffer.byteLength(c); - buff[offset] = clen; - buff.write(c, offset + 1); - - return offset + 1 + clen; - }, 0); + var offset = 0; + for (var i = 0, c = protocols.length; i < c; i++) { + buff[offset++] = lens[i]; + buff.write(protocols[i], offset); + offset += lens[i]; + } return buff; } -- cgit v1.2.3