app.js 5.3 KB

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