Skip to content
This repository was archived by the owner on Mar 24, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions frameworks/JavaScript/express/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ This is the Express portion of a [benchmarking test suite](../) comparing a vari

## Infrastructure Software Versions
The tests were run with:
* [Node.js v0.12.2](http://nodejs.org/)
* [Express 4.12.3](http://expressjs.com/)
* [Node.js v7.5.0](http://nodejs.org/)
* [Express 4.14.1](http://expressjs.com/)

## Resources
* http://nodejs.org/api/cluster.html
Expand Down
185 changes: 83 additions & 102 deletions frameworks/JavaScript/express/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,47 +3,48 @@
* Module dependencies.
*/

var cluster = require('cluster')
, numCPUs = require('os').cpus().length
, express = require('express')
, Sequelize = require('sequelize')
, mongoose = require('mongoose')
, conn = mongoose.connect('mongodb://TFB-database/hello_world')
, async = require('async');
const cluster = require('cluster'),
numCPUs = require('os').cpus().length,
express = require('express'),
Sequelize = require('sequelize'),
mongoose = require('mongoose'),
conn = mongoose.connect('mongodb://TFB-database/hello_world'),
async = require('async');

// Middleware
var bodyParser = require('body-parser')
, methodOverride = require('method-override')
, errorHandler = require('errorhandler');
const bodyParser = require('body-parser'),
methodOverride = require('method-override'),
errorHandler = require('errorhandler');

var Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
const Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;

var WorldSchema = new mongoose.Schema({
const WorldSchema = new mongoose.Schema({
id : Number,
randomNumber: Number
}, {
collection: 'world'
}),
MWorld = conn.model('world', WorldSchema);

var FortuneSchema = new mongoose.Schema({
const FortuneSchema = new mongoose.Schema({
id : Number,
message : String
}, {
collection: 'fortune'
}),
MFortune = conn.model('fortune', FortuneSchema);

var sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
const sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
host: 'TFB-database',
dialect: 'mysql',
logging: false
});

var World = sequelize.define('World', {
const World = sequelize.define('World', {
id: {
type: 'Sequelize.INTEGER'
type: 'Sequelize.INTEGER',
primaryKey: true
},
randomNumber: {
type: 'Sequelize.INTEGER'
Expand All @@ -52,9 +53,10 @@ var World = sequelize.define('World', {
timestamps: false,
freezeTableName: true
});
var Fortune = sequelize.define('Fortune', {
const Fortune = sequelize.define('Fortune', {
id: {
type: 'Sequelize.INTEGER'
type: 'Sequelize.INTEGER',
primaryKey: true
},
message: {
type: 'Sequelize.STRING'
Expand All @@ -66,30 +68,29 @@ var Fortune = sequelize.define('Fortune', {

if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}

cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.pid + ' died');
});
cluster.on('exit', (worker, code, signal) =>
console.log('worker ' + worker.pid + ' died'));
} else {
var app = module.exports = express();
const app = module.exports = express();

// Configuration
// https://github.com/expressjs/method-override#custom-logic
app.use(bodyParser.urlencoded({extended: true}));
app.use(methodOverride(function(req, res){
app.use(bodyParser.urlencoded({ extended: true }));
app.use(methodOverride((req, res) => {
if (req.body && typeof req.body === 'object' && '_method' in req.body) {
// look in urlencoded POST bodies and delete it
var method = req.body._method
delete req.body._method
return method
const method = req.body._method;
delete req.body._method;
return method;
}
}));

// Set headers for all routes
app.use(function(req, res, next) {
app.use((req, res, next) => {
res.setHeader("Server", "Express");
return next();
});
Expand All @@ -98,7 +99,7 @@ if (cluster.isMaster) {
app.set('views', __dirname + '/views');

// Check Node env.
var env = process.env.NODE_ENV || 'development';
const env = process.env.NODE_ENV || 'development';
if ('development' == env) {
app.use(errorHandler({ dumpExceptions: true, showStack: true }));
}
Expand All @@ -107,55 +108,45 @@ if (cluster.isMaster) {
}

// Routes
app.get('/json', (req, res) => res.send({ message: 'Hello, World!' }));

app.get('/json', function(req, res) {
res.send({ message: 'Hello, World!' });
});

app.get('/plaintext', function(req, res) {
res.header('Content-Type', 'text/plain').send('Hello, World!');
});
app.get('/plaintext', (req, res) =>
res.header('Content-Type', 'text/plain').send('Hello, World!'));

app.get('/mongoose', function(req, res) {
var queries = isNaN(req.query.queries) ? 1 : parseInt(req.query.queries, 10)
, queryFunctions = [];
app.get('/mongoose', (req, res) => {
let queries = isNaN(req.query.queries) ? 1 : parseInt(req.query.queries, 10);
const queryFunctions = [];

queries = Math.min(Math.max(queries, 1), 500);

for (var i = 1; i <= queries; i++ ) {
queryFunctions.push(function(callback) {
MWorld.findOne({ id: (Math.floor(Math.random() * 10000) + 1) }).exec(callback);
});
for (let i = 1; i <= queries; i++ ) {
queryFunctions.push((callback) =>
MWorld.findOne({ id: (Math.floor(Math.random() * 10000) + 1) })
.exec(callback));
}

async.parallel(queryFunctions, function(err, results) {
if (!req.query.queries) {
results = results[0];
}
res.send(results);
});
async.parallel(queryFunctions, (err, results) =>
res.send(!req.query.queries ? results[0] : results));
});

app.get('/mysql-orm', function(req, res) {
var queriesRaw = parseInt(req.query.queries, 10)
, queries = isNaN(queriesRaw) ? 1 : queriesRaw
, queryFunctions = [];
app.get('/mysql-orm', (req, res) => {
let queriesRaw = parseInt(req.query.queries, 10),
queries = isNaN(queriesRaw) ? 1 : queriesRaw;
const queryFunctions = [];

queries = Math.min(Math.max(queries, 1), 500);

for (var i = 1; i <= queries; i++ ) {
queryFunctions.push(function(callback) {
for (let i = 1; i <= queries; i++ ) {
queryFunctions.push((callback) => {
World.findOne({
where: {
id: Math.floor(Math.random() * 10000) + 1}
}
).then(function(world) {
callback(null, world);
});
).then((world) => callback(null, world));
});
}

async.parallel(queryFunctions, function(err, results) {
async.parallel(queryFunctions, (err, results) => {
if (req.query.queries == undefined) {
results = results[0];
}
Expand All @@ -164,46 +155,42 @@ if (cluster.isMaster) {
});
});

app.get('/mongoose-fortune', function(req, res) {
MFortune.find({}, function(err, fortunes) {
var newFortune = {id: 0, message: "Additional fortune added at request time."};
app.get('/mongoose-fortune', (req, res) => {
MFortune.find({}, (err, fortunes) => {
const newFortune = {id: 0, message: "Additional fortune added at request time."};
fortunes.push(newFortune);
fortunes.sort(function (a, b) {
return (a.message < b.message) ? -1 : 1;
});
fortunes.sort((a, b) => (a.message < b.message) ? -1 : 1);

res.render('fortunes', {fortunes: fortunes});
});
});

app.get('/mysql-orm-fortune', function(req, res) {
Fortune.findAll().then(function (fortunes) {
var newFortune = {id: 0, message: "Additional fortune added at request time."};
app.get('/mysql-orm-fortune', (req, res) => {
Fortune.findAll().then((fortunes) => {
const newFortune = {id: 0, message: "Additional fortune added at request time."};
fortunes.push(newFortune);
fortunes.sort(function (a, b) {
return (a.message < b.message) ? -1 : 1;
});
fortunes.sort((a, b) => (a.message < b.message) ? -1 : 1);

res.render('fortunes', {fortunes: fortunes});
});
});

app.get('/mongoose-update', function(req, res) {
var selectFunctions = [],
app.get('/mongoose-update', (req, res) => {
const selectFunctions = [],
queries = Math.min(parseInt(req.query.queries) || 1, 500);

for (var i = 1; i <= queries; i++ ) {
selectFunctions.push(function(callback) {
MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 }).exec(callback);
});
for (let i = 1; i <= queries; i++ ) {
selectFunctions.push((callback) =>
MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 })
.exec(callback));
}

async.parallel(selectFunctions, function(err, worlds) {
var updateFunctions = [];
async.parallel(selectFunctions, (err, worlds) => {
const updateFunctions = [];

for (var i = 0; i < queries; i++) {
(function(i){
updateFunctions.push(function(callback){
for (let i = 0; i < queries; i++) {
((i) => {
updateFunctions.push((callback) => {
worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
MWorld.update({
id: worlds[i]
Expand All @@ -214,43 +201,37 @@ if (cluster.isMaster) {
})(i);
}

async.parallel(updateFunctions, function(err, updates) {
res.send(worlds);
});
async.parallel(updateFunctions, (err, updates) => res.send(worlds));
});
});

app.get('/mysql-orm-update', function(req, res) {
var selectFunctions = [],
app.get('/mysql-orm-update', (req, res) => {
const selectFunctions = [],
queries = Math.min(parseInt(req.query.queries) || 1, 500);

for (var i = 1; i <= queries; i++ ) {
selectFunctions.push(function(callback) {
for (let i = 1; i <= queries; i++ ) {
selectFunctions.push((callback) => {
World.findOne({
where: {
id: Math.floor(Math.random() * 10000) + 1}
}
).then(function(world) {
callback(null, world);
});
).then((world) => callback(null, world));
});
}

async.parallel(selectFunctions, function(err, worlds) {
var updateFunctions = [];
async.parallel(selectFunctions, (err, worlds) => {
const updateFunctions = [];

for (var i = 0; i < queries; i++) {
(function(i){
updateFunctions.push(function(callback){
for (let i = 0; i < queries; i++) {
((i) => {
updateFunctions.push((callback) => {
worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
worlds[i].save().then(callback());
});
})(i);
}

async.parallel(updateFunctions, function(err, updates) {
res.send(worlds);
});
async.parallel(updateFunctions, (err, updates) => res.send(worlds));
});

});
Expand Down
14 changes: 7 additions & 7 deletions frameworks/JavaScript/express/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
"version": "0.0.1",
"private": true,
"dependencies": {
"express": "4.14.0",
"body-parser": "1.15.2",
"method-override": "2.3.6",
"express": "4.14.1",
"body-parser": "1.16.1",
"method-override": "2.3.7",
"errorhandler": "1.4.3",
"async": "1.5.2",
"async": "2.1.5",
"jade": "1.11.0",
"sequelize": "3.6.0",
"mysql": "2.11.1",
"mongoose": "4.5.3"
"sequelize": "3.30.0",
"mysql": "2.13.0",
"mongoose": "4.8.4"
}
}
Loading