From f53a6fb48b743b20286dd500a4689614ead39e3b Mon Sep 17 00:00:00 2001 From: Brian White Date: Sat, 31 Dec 2016 15:58:14 -0500 Subject: [PATCH] benchmark: add http header setting scenarios PR-URL: https://github.com/nodejs/node/pull/10558 Reviewed-By: Matteo Collina Reviewed-By: James M Snell Reviewed-By: Evan Lucas --- benchmark/http/_http_simple.js | 88 ++++++++++++++++++++++------------ benchmark/http/simple.js | 6 ++- 2 files changed, 62 insertions(+), 32 deletions(-) diff --git a/benchmark/http/_http_simple.js b/benchmark/http/_http_simple.js index 644601864dd857..6886ccaf64d996 100644 --- a/benchmark/http/_http_simple.js +++ b/benchmark/http/_http_simple.js @@ -4,10 +4,10 @@ var http = require('http'); var port = parseInt(process.env.PORT || 8000); -var fixed = 'C'.repeat(20 * 1024), - storedBytes = {}, - storedBuffer = {}, - storedUnicode = {}; +var fixed = 'C'.repeat(20 * 1024); +var storedBytes = Object.create(null); +var storedBuffer = Object.create(null); +var storedUnicode = Object.create(null); var useDomains = process.env.NODE_USE_DOMAINS; @@ -29,11 +29,13 @@ var server = module.exports = http.createServer(function(req, res) { dom.add(res); } - var commands = req.url.split('/'); - var command = commands[1]; + // URL format: //// + var params = req.url.split('/'); + var command = params[1]; var body = ''; - var arg = commands[2]; - var n_chunks = parseInt(commands[3], 10); + var arg = params[2]; + var n_chunks = parseInt(params[3], 10); + var resHow = (params.length >= 5 ? params[4] : 'normal'); var status = 200; var n, i; @@ -45,7 +47,6 @@ var server = module.exports = http.createServer(function(req, res) { storedBytes[n] = 'C'.repeat(n); } body = storedBytes[n]; - } else if (command === 'buffer') { n = ~~arg; if (n <= 0) @@ -57,7 +58,6 @@ var server = module.exports = http.createServer(function(req, res) { } } body = storedBuffer[n]; - } else if (command === 'unicode') { n = ~~arg; if (n <= 0) @@ -66,23 +66,30 @@ var server = module.exports = http.createServer(function(req, res) { storedUnicode[n] = '\u263A'.repeat(n); } body = storedUnicode[n]; - } else if (command === 'quit') { res.connection.server.close(); body = 'quitting'; - } else if (command === 'fixed') { body = fixed; - } else if (command === 'echo') { - const headers = { - 'Content-Type': 'text/plain', - 'Transfer-Encoding': 'chunked' - }; - res.writeHead(200, headers); + switch (resHow) { + case 'setHeader': + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('Transfer-Encoding', 'chunked'); + break; + case 'setHeaderWH': + res.setHeader('Content-Type', 'text/plain'); + res.writeHead(200, { 'Transfer-Encoding': 'chunked' }); + break; + default: + res.writeHead(200, { + 'Content-Type': 'text/plain', + 'Transfer-Encoding': 'chunked' + }); + } req.pipe(res); return; - } else { status = 404; body = 'not found\n'; @@ -91,11 +98,22 @@ var server = module.exports = http.createServer(function(req, res) { // example: http://localhost:port/bytes/512/4 // sends a 512 byte body in 4 chunks of 128 bytes if (n_chunks > 0) { - const headers = { - 'Content-Type': 'text/plain', - 'Transfer-Encoding': 'chunked' - }; - res.writeHead(status, headers); + switch (resHow) { + case 'setHeader': + res.statusCode = status; + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('Transfer-Encoding', 'chunked'); + break; + case 'setHeaderWH': + res.setHeader('Content-Type', 'text/plain'); + res.writeHead(status, { 'Transfer-Encoding': 'chunked' }); + break; + default: + res.writeHead(status, { + 'Content-Type': 'text/plain', + 'Transfer-Encoding': 'chunked' + }); + } // send body in chunks var len = body.length; var step = Math.floor(len / n_chunks) || 1; @@ -105,12 +123,22 @@ var server = module.exports = http.createServer(function(req, res) { } res.end(body.slice((n_chunks - 1) * step)); } else { - const headers = { - 'Content-Type': 'text/plain', - 'Content-Length': body.length.toString() - }; - - res.writeHead(status, headers); + switch (resHow) { + case 'setHeader': + res.statusCode = status; + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('Content-Length', body.length.toString()); + break; + case 'setHeaderWH': + res.setHeader('Content-Type', 'text/plain'); + res.writeHead(status, { 'Content-Length': body.length.toString() }); + break; + default: + res.writeHead(status, { + 'Content-Type': 'text/plain', + 'Content-Length': body.length.toString() + }); + } res.end(body); } }); diff --git a/benchmark/http/simple.js b/benchmark/http/simple.js index 66113ed3758c48..39c8f29dc89a74 100644 --- a/benchmark/http/simple.js +++ b/benchmark/http/simple.js @@ -7,14 +7,16 @@ var bench = common.createBenchmark(main, { type: ['bytes', 'buffer'], length: [4, 1024, 102400], chunks: [0, 1, 4], // chunks=0 means 'no chunked encoding'. - c: [50, 500] + c: [50, 500], + res: ['normal', 'setHeader', 'setHeaderWH'] }); function main(conf) { process.env.PORT = PORT; var server = require('./_http_simple.js'); setTimeout(function() { - var path = '/' + conf.type + '/' + conf.length + '/' + conf.chunks; + var path = '/' + conf.type + '/' + conf.length + '/' + conf.chunks + '/' + + conf.res; bench.http({ path: path,