Je fais un test de stress rapide sur deux (un peu) projets Hello World écrits en node.js et asp.net-core. Les deux fonctionnent en mode production et sans enregistreur qui leur est attaché. Le résultat est étonnant! ASP.NET Core surpasse l'application node.js même après avoir effectué un travail supplémentaire, tandis que l'application node.js ne fait que restituer une vue.
Application 1: http://localhost:3000/nodejs
node.js
Utilisation : node.js, moteur de rendu express et vash.
Le code de ce point de terminaison est
router.get('/', function(req, res, next) {
var vm = {
title: 'Express',
time: new Date()
}
res.render('index', vm);
});
Comme vous pouvez le voir, cela ne fait rien à part l'envoi de la date actuelle via la time
variable à la vue.
App 2: http://localhost:5000/aspnet-core
asp.net core
Utilisation : ASP.NET Core, ciblage par modèle par défautdnxcore50
Cependant, cette application fait autre chose que le simple rendu d'une page avec une date. Il génère 5 paragraphes de différents textes aléatoires. Cela devrait théoriquement rendre cela un peu plus lourd que l'application nodejs.
Voici la méthode d'action qui rend cette page
[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
[Route("aspnet-core")]
public IActionResult Index()
{
var sb = new StringBuilder(1024);
GenerateParagraphs(5, sb);
ViewData["Message"] = sb.ToString();
return View();
}
Résultat du test de stress
Résultat du test de résistance de l'application Node.js
Mise à jour: Suite à la suggestion de Gorgi Kosev
En utilisant npm install -g recluster-cli && NODE_ENV=production recluster-cli app.js 8
Résultat du test de résistance de l'application ASP.NET Core
Je ne peux pas en croire mes yeux! Il ne peut pas être vrai que dans ce test de base, asp.net core est bien plus rapide que nodejs. Bien sûr, ce n'est pas la seule métrique utilisée pour mesurer les performances entre ces deux technologies Web, mais je me demande ce que je fais de mal du côté de node.js? .
En tant que développeur professionnel asp.net et souhaitant adapter node.js dans des projets personnels, cela me décourage - car je suis un peu paranoïaque sur la performance. Je pensais que node.js est plus rapide que asp.net core (en général - comme on le voit dans divers autres benchmarks), je veux juste me le prouver (pour m'encourager à adapter node.js).
Veuillez répondre en commentaire si vous souhaitez que j'inclue plus d'extraits de code.
Mise à jour: distribution temporelle de l'application .NET Core
Réponse du serveur
HTTP/1.1 200 OK
Cache-Control: no-store,no-cache
Date: Fri, 12 May 2017 07:46:56 GMT
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Server: Kestrel
la source
Réponses:
Comme beaucoup d'autres l'ont fait allusion, la comparaison manque de contexte.
Au moment de sa sortie, l'approche asynchrone de node.js était révolutionnaire. Depuis lors, d'autres langages et cadres Web ont adopté les approches qu'ils ont adoptées.
Pour comprendre ce que signifie la différence, vous devez simuler une demande de blocage qui représente une charge de travail d'E / S, telle qu'une demande de base de données. Dans un système de thread par demande, cela épuisera le pool de threads et les nouvelles demandes seront placées dans une file d'attente en attente d'un thread disponible.
Avec les frameworks non bloquants, cela ne se produit pas.
Considérez ce serveur node.js qui attend 1 seconde avant de répondre
Jetons maintenant 100 connexions simultanées, pendant 10s. Nous nous attendons donc à ce qu'environ 1000 demandes soient traitées.
Comme vous pouvez le voir, nous arrivons dans le stade approximatif avec 922 terminés.
Considérons maintenant le code asp.net suivant, écrit comme si async / await n'était pas encore pris en charge, ce qui nous ramène à l'ère du lancement de node.js.
62! Ici, nous voyons la limite du threadpool. En le réglant, nous pourrions obtenir plus de demandes simultanées, mais au prix de plus de ressources serveur.
Pour ces charges de travail liées aux E / S, la décision d'éviter de bloquer les threads de traitement était si dramatique.
Maintenant, apportons-le à aujourd'hui, où cette influence s'est répercutée sur l'industrie et permettons à dotnet de tirer parti de ses améliorations.
Pas de surprise ici, nous faisons maintenant correspondre node.js.
Donc qu'est-ce que tout cela veut dire?
Vos impressions que node.js est le "plus rapide" viennent d'une époque dans laquelle nous ne vivons plus. Ajoutez à cela que ce n'était jamais node / js / v8 qui était "rapide", c'était qu'ils ont cassé le thread par requête modèle. Tout le monde a rattrapé son retard.
Si votre objectif est le traitement le plus rapide possible de demandes uniques, examinez les points de repère sérieux au lieu de lancer les vôtres. Mais si à la place ce que vous voulez est simplement quelque chose qui s'adapte aux normes modernes, optez pour le langage que vous aimez et assurez-vous de ne pas bloquer ces threads.
Avertissement: Tout le code écrit et les tests sont exécutés sur un MacBook Air vieillissant pendant un dimanche matin endormi. N'hésitez pas à saisir le code et à l'essayer sur Windows ou à l'adapter à vos besoins - https://github.com/csainty/nodejs-vs-aspnetcore
la source
Les cadres de nœuds comme Express et Koa ont une surcharge terrible. "Raw" Node est nettement plus rapide.
Je ne l'ai pas essayé, mais il existe un cadre plus récent qui se rapproche beaucoup des performances du nœud "Raw": https://github.com/aerojs/aero
(voir référence sur cette page)
mise à jour: Voici quelques chiffres: https://github.com/blitzprog/webserver-benchmarks
Comme vous pouvez le voir, les frais généraux des frameworks node.js les plus populaires sont TRÈS importants!
la source