app.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /**
  2. * Module dependencies.
  3. */
  4. var cluster = require('cluster'),
  5. numCPUs = require('os').cpus().length,
  6. windows = require('os').platform() == 'win32',
  7. Hapi = require('hapi'),
  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 WorldSchema = new mongoose.Schema({
  13. id : Number,
  14. randomNumber: Number
  15. }, {
  16. collection: 'world'
  17. }),
  18. 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 server = module.exports = Hapi.createServer(null, 8080, {
  35. views: {
  36. engines: {
  37. handlebars: 'handlebars'
  38. },
  39. path: __dirname + '/views'
  40. }
  41. });
  42. server.route({
  43. method: 'GET',
  44. path: '/json',
  45. handler: function(req) {
  46. req.reply({ message: 'Hello World!' })
  47. }
  48. });
  49. server.route({
  50. method: 'GET',
  51. path: '/mongoose/{queries?}',
  52. handler: function(req){
  53. var queries = req.params.queries || 1,
  54. queryFunctions = [];
  55. queries = Math.min(Math.max(queries, 1), 500);
  56. for (var i = 1; i <= queries; i++) {
  57. queryFunctions.push(function(callback){
  58. MWorld.findOne({ id: (Math.floor(Math.random() * 10000) + 1) }).exec(callback);
  59. });
  60. }
  61. async.parallel(queryFunctions, function(err, results){
  62. req.reply(results).header('Server', 'hapi');
  63. });
  64. }
  65. });
  66. server.route({
  67. method: 'GET',
  68. path: '/mysql-orm/{queries?}',
  69. handler: function(req){
  70. if (windows) return req.reply(Hapi.error.internal('Not supported on windows'));
  71. var queries = req.params.queries || 1,
  72. queryFunctions = [];
  73. queries = Math.min(Math.max(queries, 1), 500);
  74. for (var i = 1; i <= queries; i++) {
  75. queryFunctions.push(function(callback){
  76. World.findById(Math.floor(Math.random() * 10000) + 1, callback);
  77. });
  78. }
  79. async.parallel(queryFunctions, function(err, results){
  80. req.reply(results).header('Server', 'hapi');
  81. });
  82. }
  83. });
  84. server.route({
  85. method: 'GET',
  86. path: '/fortune',
  87. handler: function(req){
  88. if (windows) return req.reply(Hapi.error.internal('Not supported on windows'));
  89. Fortune.all(function(err, fortunes){
  90. fortunes.push({
  91. id: 0,
  92. message: 'Additional fortune added at request time.'
  93. });
  94. fortunes.sort(function(a, b){
  95. return (a.message < b.message) ? -1 : 1;
  96. });
  97. req.reply.view('fortunes.handlebars', {
  98. fortunes: fortunes
  99. }).header('Server', 'hapi');
  100. });
  101. }
  102. });
  103. server.route({
  104. method: 'GET',
  105. path: '/mongoose-update/{queries?}',
  106. handler: function(req){
  107. var queries = req.params.queries || 1,
  108. selectFunctions = [];
  109. queries = Math.max(Math.min(queries, 500), 1);
  110. for (var i = 1; i <= queries; i++) {
  111. selectFunctions.push(function(callback){
  112. MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 }).exec(callback);
  113. });
  114. }
  115. async.parallel(selectFunctions, function(err, worlds) {
  116. var updateFunctions = [];
  117. for (var i = 0; i < queries; i++) {
  118. (function(i){
  119. updateFunctions.push(function(callback){
  120. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  121. MWorld.update({
  122. id: worlds[i]
  123. }, {
  124. randomNumber: worlds[i].randomNumber
  125. }, callback);
  126. });
  127. })(i);
  128. }
  129. async.parallel(updateFunctions, function(err, updates) {
  130. req.reply(worlds).header('Server', 'hapi');
  131. });
  132. });
  133. }
  134. });
  135. server.route({
  136. method: 'GET',
  137. path: '/mysql-orm-update/{queries?}',
  138. handler: function(req){
  139. var queries = req.params.queries || 1,
  140. selectFunctions = [];
  141. queries = Math.max(Math.min(queries, 500), 1);
  142. for (var i = 1; i <= queries; i++) {
  143. selectFunctions.push(function(callback){
  144. World.findById(Math.floor(Math.random() * 10000) + 1, callback);
  145. });
  146. }
  147. async.parallel(selectFunctions, function(err, worlds) {
  148. var updateFunctions = [];
  149. for (var i = 0; i < queries; i++) {
  150. (function(i){
  151. updateFunctions.push(function(callback){
  152. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  153. World.save(worlds[i], callback);
  154. });
  155. })(i);
  156. }
  157. async.parallel(updateFunctions, function(err, updates) {
  158. req.reply(worlds).header('Server', 'hapi');
  159. });
  160. });
  161. }
  162. });
  163. server.start();
  164. }