app.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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. if (queries == 1) {
  67. worlds = worlds[0];
  68. }
  69. res.send(worlds);
  70. });
  71. });
  72. app.get('/mysql-orm', function(req, res) {
  73. if (windows) return res.send(501, 'Not supported on windows');
  74. var queries = req.query.queries || 1
  75. , worlds = []
  76. , queryFunctions = [];
  77. for (var i = 1; i <= queries; i++ ) {
  78. queryFunctions.push(function(callback) {
  79. World.findById(Math.floor(Math.random()*10000) + 1, function (err, world) {
  80. worlds.push(world);
  81. callback(null, 'success');
  82. });
  83. });
  84. }
  85. async.parallel(queryFunctions, function(err, results) {
  86. if (queries == 1) {
  87. worlds = worlds[0];
  88. }
  89. res.send(worlds);
  90. });
  91. });
  92. app.get('/fortune', function(req, res) {
  93. if (windows) return res.send(501, 'Not supported on windows');
  94. Fortune.all(function (err, fortunes) {
  95. var newFortune = {id: 0, message: "Additional fortune added at request time."};
  96. fortunes.push(newFortune);
  97. fortunes.sort(sortFortunes);
  98. res.render('fortunes', {fortunes: fortunes});
  99. });
  100. });
  101. function sortFortunes(a, b) {
  102. return (a.message < b.message) ? -1 : (a.message > b.message) ? 1 : 0;
  103. }
  104. app.get('/mongoose-update', function(req, res) {
  105. var queries = req.query.queries || 1
  106. , selectFunctions = [];
  107. queries = Math.min(queries, 500);
  108. for (var i = 1; i <= queries; i++ ) {
  109. selectFunctions.push(function(callback) {
  110. MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 }).exec(callback);
  111. });
  112. }
  113. async.parallel(selectFunctions, function(err, worlds) {
  114. var updateFunctions = [];
  115. for (var i = 0; i < queries; i++) {
  116. (function(i){
  117. updateFunctions.push(function(callback){
  118. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  119. MWorld.update({
  120. id: worlds[i]
  121. }, {
  122. randomNumber: worlds[i].randomNumber
  123. }, callback);
  124. });
  125. })(i);
  126. }
  127. async.parallel(updateFunctions, function(err, updates) {
  128. res.send(worlds);
  129. });
  130. });
  131. });
  132. app.get('/mysql-orm-update', function(req, res) {
  133. if (windows) return res.send(501, 'Not supported on windows');
  134. var queries = req.query.queries || 1
  135. , selectFunctions = [];
  136. queries = Math.min(queries, 500);
  137. for (var i = 1; i <= queries; i++ ) {
  138. selectFunctions.push(function(callback) {
  139. World.findById(Math.floor(Math.random() * 10000) + 1, callback);
  140. });
  141. }
  142. async.parallel(selectFunctions, function(err, worlds) {
  143. var updateFunctions = [];
  144. for (var i = 0; i < queries; i++) {
  145. (function(i){
  146. updateFunctions.push(function(callback){
  147. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  148. World.save(worlds[i], callback);
  149. });
  150. })(i);
  151. }
  152. async.parallel(updateFunctions, function(err, updates) {
  153. res.send(worlds);
  154. });
  155. });
  156. });
  157. app.listen(8080);
  158. }