app.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /**
  2. * Module dependencies.
  3. */
  4. var cluster = require('cluster')
  5. , numCPUs = require('os').cpus().length
  6. , windows = require('os').platform() == 'win32'
  7. , express = require('express')
  8. , mongoose = require('mongoose')
  9. , async = require('async')
  10. , conn = mongoose.connect('mongodb://localhost/hello_world')
  11. , connMap = { user: 'benchmarkdbuser', password: 'benchmarkdbpass', database: 'hello_world', host: 'localhost' };
  12. var Schema = mongoose.Schema
  13. , ObjectId = Schema.ObjectId;
  14. var WorldSchema = new Schema({
  15. id : Number
  16. , randomNumber : Number
  17. }, { collection : 'world' });
  18. var MWorld = conn.model('World', WorldSchema);
  19. if (!windows) {
  20. var Mapper = require('mapper');
  21. Mapper.connect(connMap, {verbose: false, strict: false});
  22. var World = Mapper.map("World", "id", "randomNumber");
  23. var Fortune = Mapper.map("Fortune", "id", "message");
  24. }
  25. if (cluster.isMaster) {
  26. // Fork workers.
  27. for (var i = 0; i < numCPUs; i++) {
  28. cluster.fork();
  29. }
  30. cluster.on('exit', function(worker, code, signal) {
  31. console.log('worker ' + worker.pid + ' died');
  32. });
  33. } else {
  34. var app = module.exports = express();
  35. // Configuration
  36. app.configure(function(){
  37. app.use(express.bodyParser());
  38. app.use(express.methodOverride());
  39. app.use(app.router);
  40. app.set('view engine', 'jade');
  41. app.set('views', __dirname + '/views');
  42. });
  43. app.configure('development', function() {
  44. app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
  45. });
  46. app.configure('production', function() {
  47. app.use(express.errorHandler());
  48. });
  49. // Routes
  50. app.get('/json', function(req, res) {
  51. res.send({ message: 'Hello World!' })
  52. });
  53. app.get('/mongoose', function(req, res) {
  54. var queries = req.query.queries || 1,
  55. worlds = [],
  56. queryFunctions = [];
  57. for (var i = 1; i <= queries; i++ ) {
  58. queryFunctions.push(function(callback) {
  59. MWorld.findOne({ id: (Math.floor(Math.random() * 10000) + 1 )}).exec(function (err, world) {
  60. worlds.push(world);
  61. callback(null, 'success');
  62. });
  63. });
  64. }
  65. async.parallel(queryFunctions, function(err, results) {
  66. res.send(worlds);
  67. });
  68. });
  69. app.get('/mysql-orm', function(req, res) {
  70. if (windows) return res.send(501, 'Not supported on windows');
  71. var queries = req.query.queries || 1
  72. , worlds = []
  73. , queryFunctions = [];
  74. for (var i = 1; i <= queries; i++ ) {
  75. queryFunctions.push(function(callback) {
  76. World.findById(Math.floor(Math.random()*10000) + 1, function (err, world) {
  77. worlds.push(world);
  78. callback(null, 'success');
  79. });
  80. });
  81. }
  82. async.parallel(queryFunctions, function(err, results) {
  83. res.send(worlds);
  84. });
  85. });
  86. app.get('/fortune', function(req, res) {
  87. if (windows) return res.send(501, 'Not supported on windows');
  88. Fortune.all(function (err, fortunes) {
  89. var newFortune = {id: 0, message: "Additional fortune added at request time."};
  90. fortunes.push(newFortune);
  91. fortunes.sort(sortFortunes);
  92. res.render('fortunes', {fortunes: fortunes});
  93. });
  94. });
  95. function sortFortunes(a, b) {
  96. return (a.message < b.message) ? -1 : (a.message > b.message) ? 1 : 0;
  97. }
  98. app.get('/mongoose-update', function(req, res) {
  99. var queries = req.query.queries || 1
  100. , selectFunctions = [];
  101. queries = Math.min(queries, 500);
  102. for (var i = 1; i <= queries; i++ ) {
  103. selectFunctions.push(function(callback) {
  104. MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 }).exec(callback);
  105. });
  106. }
  107. async.parallel(selectFunctions, function(err, worlds) {
  108. var updateFunctions = [];
  109. for (var i = 0; i < queries; i++) {
  110. (function(i){
  111. updateFunctions.push(function(callback){
  112. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  113. MWorld.update({
  114. id: worlds[i]
  115. }, {
  116. randomNumber: worlds[i].randomNumber
  117. }, callback);
  118. });
  119. })(i);
  120. }
  121. async.parallel(updateFunctions, function(err, updates) {
  122. res.send(worlds);
  123. });
  124. });
  125. });
  126. app.get('/mysql-orm-update', function(req, res) {
  127. if (windows) return res.send(501, 'Not supported on windows');
  128. var queries = req.query.queries || 1
  129. , selectFunctions = [];
  130. queries = Math.min(queries, 500);
  131. for (var i = 1; i <= queries; i++ ) {
  132. selectFunctions.push(function(callback) {
  133. World.findById(Math.floor(Math.random() * 10000) + 1, callback);
  134. });
  135. }
  136. async.parallel(selectFunctions, function(err, worlds) {
  137. var updateFunctions = [];
  138. for (var i = 0; i < queries; i++) {
  139. (function(i){
  140. updateFunctions.push(function(callback){
  141. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  142. World.save(worlds[i], callback);
  143. });
  144. })(i);
  145. }
  146. async.parallel(updateFunctions, function(err, updates) {
  147. res.send(worlds);
  148. });
  149. });
  150. });
  151. app.listen(8080);
  152. }