Robię szybki test warunków skrajnych na dwóch (trochę) napisanych projektach Hello World node.js i asp.net-core. Oba działają w trybie produkcyjnym i bez dołączonego do nich loggera. Rezultat jest zdumiewający! ASP.NET core przewyższa aplikację node.js nawet po wykonaniu dodatkowej pracy, podczas gdy aplikacja node.js po prostu renderuje widok.
Aplikacja 1: http://localhost:3000/nodejs
node.js
Wykorzystanie : node.js, express i vash renderowania silnika.
Kod w tym punkcie końcowym to
router.get('/', function(req, res, next) {
var vm = {
title: 'Express',
time: new Date()
}
res.render('index', vm);
});
Jak widać, nie robi nic poza wysłaniem aktualnej daty przez time
zmienną do widoku.
Aplikacja 2: http://localhost:5000/aspnet-core
asp.net core
Używanie : ASP.NET Core, domyślne kierowanie na szablondnxcore50
Jednak ta aplikacja robi coś innego niż tylko renderowanie strony z datą. Generuje 5 akapitów różnych losowych tekstów. Powinno to teoretycznie uczynić to nieco cięższym niż aplikacja nodejs.
Oto metoda akcji, która renderuje tę stronę
[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();
}
Wynik testu wysiłkowego
Wynik testu warunków skrajnych aplikacji Node.js.
Aktualizacja: zgodnie z sugestią Gorgi Koseva
Za pomocą npm install -g recluster-cli && NODE_ENV=production recluster-cli app.js 8
Wynik testu warunków skrajnych aplikacji ASP.NET Core
Nie mogę uwierzyć własnym oczom! Nie może być prawdą, że w tym podstawowym teście rdzeń asp.net jest znacznie szybszy niż nodejs. Oczywiście nie jest to jedyna miara używana do pomiaru wydajności między tymi dwoma technologiami sieciowymi, ale zastanawiam się, co robię źle po stronie node.js? .
Będąc profesjonalnym programistą asp.net i chcącym adaptować node.js w osobistych projektach, trochę mnie to zniechęca - ponieważ jestem trochę paranoikiem co do wydajności. Myślałem, że node.js jest szybszy niż rdzeń asp.net (ogólnie - jak widać w różnych innych testach porównawczych), po prostu chcę to sobie udowodnić (aby zachęcić się do adaptacji node.js).
Proszę o odpowiedź w komentarzu, jeśli chcesz, żebym dołączył więcej fragmentów kodu.
Aktualizacja: rozkład czasu aplikacji .NET Core
Odpowiedź serwera
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
źródło
Odpowiedzi:
Jak wspominało wielu innych, porównanie nie ma kontekstu.
W momencie jego wydania podejście asynchroniczne node.js było rewolucyjne. Od tego czasu inne języki i frameworki internetowe przyjęły podejście, które przyjęły do głównego nurtu.
Aby zrozumieć, co oznaczała różnica, należy zasymulować żądanie blokujące, które reprezentuje pewne obciążenie we / wy, takie jak żądanie bazy danych. W systemie wątków na żądanie spowoduje to wyczerpanie puli wątków, a nowe żądania będą umieszczane w kolejce oczekującej na dostępny wątek.
W przypadku frameworków non-blocking-io tak się nie dzieje.
Rozważmy ten serwer node.js, który czeka 1 sekundę przed odpowiedzią
Rzućmy teraz na to 100 równoczesnych koneksji przez 10 sekund. Spodziewamy się więc około 1000 wniosków do wykonania.
Jak widać, mamy ukończone 922.
Rozważmy teraz następujący kod asp.net, napisany tak, jakby async / await nie były jeszcze obsługiwane, dlatego datuje się od ery uruchamiania node.js.
62! Tutaj widzimy granicę puli wątków. Po dostrojeniu moglibyśmy uzyskać więcej jednoczesnych żądań, ale kosztem większej ilości zasobów serwera.
W przypadku tych obciążeń związanych z IO posunięcie w celu uniknięcia blokowania wątków przetwarzania było tak dramatyczne.
Teraz przenieśmy to do dnia dzisiejszego, gdzie ten wpływ rozchodził się w branży i pozwolił dotnet na skorzystanie z jego ulepszeń.
Żadnych niespodzianek, teraz dopasowujemy node.js.
Więc co to wszystko oznacza?
Twoje wrażenia, że node.js jest „najszybszy” pochodzą z epoki, w której już nie żyjemy. Dodaj do tego, że to nigdy node / js / v8 nie były „szybkie”, chodziło o to, że zepsuły wątek na żądanie Model. Wszyscy inni nadrabiają zaległości.
Jeśli Twoim celem jest jak najszybsze przetwarzanie pojedynczych żądań, przyjrzyj się poważnym testom porównawczym, zamiast wprowadzać własne. Ale jeśli zamiast tego chcesz po prostu coś, co dostosowuje się do współczesnych standardów, wybierz dowolny język i upewnij się, że nie blokujesz tych wątków.
Zastrzeżenie: cały kod napisany i przetestowany na starzejącym się MacBooku Air w senny niedzielny poranek. Pobierz kod i wypróbuj go w systemie Windows lub dostosuj do swoich potrzeb - https://github.com/csainty/nodejs-vs-aspnetcore
źródło
Struktury węzłów, takie jak Express i Koa, mają straszny narzut. Węzeł „Raw” jest znacznie szybszy.
Nie próbowałem tego, ale jest nowszy framework, który jest bardzo zbliżony do wydajności węzła „Raw”: https://github.com/aerojs/aero
(zobacz benchmark na tej stronie)
aktualizacja: Oto kilka liczb: https://github.com/blitzprog/webserver-benchmarks
Jak widać, narzuty w najpopularniejszych frameworkach node.js są BARDZO znaczące!
źródło