Saya melakukan tes stres cepat pada dua (agak) halo proyek dunia yang ditulis node.js dan asp.net-core. Keduanya berjalan dalam mode produksi dan tanpa logger yang menyertainya. Hasilnya mencengangkan! Inti ASP.NET mengungguli aplikasi node.js bahkan setelah melakukan beberapa pekerjaan tambahan sedangkan aplikasi node.js hanya menampilkan tampilan.
Aplikasi 1: http://localhost:3000/nodejs
node.js
Menggunakan : node.js, mesin rendering ekspres dan vash.
Kode di titik akhir ini adalah
router.get('/', function(req, res, next) {
var vm = {
title: 'Express',
time: new Date()
}
res.render('index', vm);
});
Seperti yang Anda lihat, itu tidak melakukan apa-apa selain mengirim tanggal saat ini melalui time
variabel ke tampilan.
Aplikasi 2: http://localhost:5000/aspnet-core
asp.net core
Menggunakan : ASP.NET Core, penargetan templat defaultdnxcore50
Namun aplikasi ini melakukan sesuatu selain dari hanya merender halaman dengan tanggal di atasnya. Ini menghasilkan 5 paragraf dari berbagai teks acak. Ini secara teoritis harus membuat ini sedikit lebih berat daripada aplikasi nodejs.
Berikut adalah metode tindakan yang merender halaman ini
[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();
}
Hasil tes stres
Hasil stress test Node.js App
Pembaruan: Mengikuti saran dari Gorgi Kosev
Menggunakan npm install -g recluster-cli && NODE_ENV=production recluster-cli app.js 8
Hasil tes stres ASP.NET Core App
Tidak bisa mempercayai mataku! Tidak mungkin benar bahwa dalam tes dasar ini inti asp.net jauh lebih cepat daripada nodejs. Tentunya ini bukan satu-satunya metrik yang digunakan untuk mengukur kinerja antara dua teknologi web ini, tetapi saya bertanya-tanya apa yang saya lakukan salah di sisi node.js? .
Menjadi pengembang asp.net profesional dan ingin mengadaptasi node.js dalam proyek-proyek pribadi, ini agak membuat saya kecewa - karena saya sedikit paranoid tentang kinerja. Saya pikir node.js lebih cepat dari inti asp.net (secara umum - seperti yang terlihat di berbagai tolok ukur lainnya) Saya hanya ingin membuktikannya kepada diri saya sendiri (untuk mendorong diri saya dalam mengadaptasi node.js).
Harap balas komentar jika Anda ingin saya memasukkan lebih banyak cuplikan kode.
Pembaruan: Distribusi waktu aplikasi .NET Core
Respons server
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
sumber
Jawaban:
Seperti yang telah disinggung oleh banyak orang lain, perbandingan itu tidak memiliki konteks.
Pada saat dirilis, pendekatan async dari node.js adalah revolusioner. Sejak itu bahasa lain dan kerangka kerja web telah mengadopsi pendekatan yang mereka ambil arus utama.
Untuk memahami apa perbedaannya, Anda perlu mensimulasikan permintaan pemblokiran yang mewakili beberapa beban kerja IO, seperti permintaan basis data. Di sistem utas per permintaan, ini akan menghabiskan threadpool dan permintaan baru akan dimasukkan ke antrian menunggu utas tersedia.
Dengan kerangka kerja non-blocking-io ini tidak terjadi.
Pertimbangkan server node.js ini yang menunggu 1 detik sebelum merespons
Sekarang mari kita lemparkan 100 konkurensi konkuren untuk 10s. Jadi kami berharap sekitar 1000 permintaan selesai.
Seperti yang dapat Anda lihat, kami tiba di stadion baseball dengan 922 selesai.
Sekarang perhatikan kode asp.net berikut, ditulis seolah-olah async / menunggu belum didukung, oleh karena itu dating kembali ke era peluncuran node.js.
62! Di sini kita melihat batas threadpool. Dengan menyetelnya, kita bisa mendapatkan lebih banyak permintaan bersamaan, tetapi dengan biaya lebih banyak sumber daya server.
Untuk beban kerja yang terikat IO ini, langkah untuk menghindari pemblokiran thread pemrosesan sangat dramatis.
Sekarang mari kita bawa ke hari ini, di mana pengaruh itu telah beriak melalui industri dan memungkinkan dotnet untuk mengambil keuntungan dari peningkatannya.
Tidak ada kejutan di sini, kami sekarang mencocokkan node.js.
Jadi apa artinya semua ini?
Kesan Anda bahwa node.js adalah "tercepat" berasal dari era kita tidak lagi hidup. Tambahkan ke bahwa itu tidak pernah node / js / v8 yang "cepat", itu adalah bahwa mereka melanggar thread-per-permintaan model. Semua orang sudah menyusul.
Jika tujuan Anda adalah pemrosesan permintaan tunggal yang paling cepat, maka lihatlah tolok ukur yang serius daripada menggulirkan permintaan Anda sendiri. Tetapi jika sebaliknya yang Anda inginkan hanyalah sesuatu yang memenuhi standar modern, maka pilih bahasa apa pun yang Anda suka dan pastikan Anda tidak memblokir utas tersebut.
Penafian: Semua kode ditulis, dan tes dijalankan, pada MacBook Air yang menua selama Minggu pagi yang mengantuk. Jangan ragu untuk mengambil kode dan mencobanya di Windows atau sesuaikan dengan kebutuhan Anda - https://github.com/csainty/nodejs-vs-aspnetcore
sumber
Kerangka Node seperti Express dan Koa memiliki overhead yang buruk. "Raw" Node secara signifikan lebih cepat.
Saya belum mencobanya, tetapi ada kerangka kerja yang lebih baru yang mendekati kinerja "Raw" Node: https://github.com/aerojs/aero
(lihat patokan di halaman itu)
pembaruan: Berikut adalah beberapa angka: https://github.com/blitzprog/webserver-benchmarks
Seperti yang Anda lihat, overhead dalam kerangka node.js paling populer SANGAT signifikan!
sumber