app.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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', charset: 'utf8' };
  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. if (queries == 1) {
  63. results = results[0];
  64. }
  65. req.reply(results).header('Server', 'hapi');
  66. });
  67. }
  68. });
  69. server.route({
  70. method: 'GET',
  71. path: '/mysql-orm/{queries?}',
  72. handler: function(req, reply){
  73. if (windows) return req.reply(Hapi.error.internal('Not supported on windows'));
  74. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  75. queryFunctions = [];
  76. queries = Math.min(Math.max(queries, 1), 500);
  77. for (var i = 1; i <= queries; i++) {
  78. queryFunctions.push(function(callback){
  79. World.findById(Math.floor(Math.random() * 10000) + 1, callback);
  80. });
  81. }
  82. async.parallel(queryFunctions, function(err, results){
  83. if (!req.params.queries) {
  84. results = results[0];
  85. }
  86. reply(results).header('Server', 'hapi');
  87. });
  88. }
  89. });
  90. server.route({
  91. method: 'GET',
  92. path: '/fortune',
  93. handler: function(req){
  94. if (windows) return req.reply(Hapi.error.internal('Not supported on windows'));
  95. Fortune.all(function(err, fortunes){
  96. fortunes.push({
  97. id: 0,
  98. message: 'Additional fortune added at request time.'
  99. });
  100. fortunes.sort(function(a, b){
  101. return (a.message < b.message) ? -1 : 1;
  102. });
  103. req.reply.view('fortunes.handlebars', {
  104. fortunes: fortunes
  105. }).header('Server', 'hapi');
  106. });
  107. }
  108. });
  109. server.route({
  110. method: 'GET',
  111. path: '/mongoose-update/{queries?}',
  112. handler: function(req){
  113. var queries = req.params.queries || 1,
  114. selectFunctions = [];
  115. queries = Math.max(Math.min(queries, 500), 1);
  116. for (var i = 1; i <= queries; i++) {
  117. selectFunctions.push(function(callback){
  118. MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 }).exec(callback);
  119. });
  120. }
  121. async.parallel(selectFunctions, function(err, worlds) {
  122. var updateFunctions = [];
  123. for (var i = 0; i < queries; i++) {
  124. (function(i){
  125. updateFunctions.push(function(callback){
  126. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  127. MWorld.update({
  128. id: worlds[i]
  129. }, {
  130. randomNumber: worlds[i].randomNumber
  131. }, callback);
  132. });
  133. })(i);
  134. }
  135. async.parallel(updateFunctions, function(err, updates) {
  136. req.reply(worlds).header('Server', 'hapi');
  137. });
  138. });
  139. }
  140. });
  141. server.route({
  142. method: 'GET',
  143. path: '/mysql-orm-update/{queries?}',
  144. handler: function(req){
  145. var queries = req.params.queries || 1,
  146. selectFunctions = [];
  147. queries = Math.max(Math.min(queries, 500), 1);
  148. for (var i = 1; i <= queries; i++) {
  149. selectFunctions.push(function(callback){
  150. World.findById(Math.floor(Math.random() * 10000) + 1, callback);
  151. });
  152. }
  153. async.parallel(selectFunctions, function(err, worlds) {
  154. var updateFunctions = [];
  155. for (var i = 0; i < queries; i++) {
  156. (function(i){
  157. updateFunctions.push(function(callback){
  158. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  159. World.save(worlds[i], callback);
  160. });
  161. })(i);
  162. }
  163. async.parallel(updateFunctions, function(err, updates) {
  164. req.reply(worlds).header('Server', 'hapi');
  165. });
  166. });
  167. }
  168. });
  169. server.start();
  170. }