Node.js vs Java: Perbandingan kinerja server HTTP asli untuk kasus hello world
Artikel terbaru tentang seri perbandingan kinerja menjadi cukup populer di komunitas menengah. Awalnya saya melakukan perbandingan antara server native Node/Deno/Bun dengan SpringBoot. Saya mendapat komentar bahwa ini adalah perbandingan yang tidak adil. SpringBoot adalah kerangka kerja dan harus dibandingkan dengan kerangka kerja di sisi lain. Menghormati komentar, saya melakukan perbandingan lanjutan SpringBoot dengan Node/Deno/Bun yang berjalan di express/fastify. Saya masih mendapat komentar bahwa perbandingan server HTTP asli di kedua sisi akan sangat berguna.
Dalam artikel ini, dan beberapa artikel lanjutan, saya akan membandingkan server asli yang disediakan oleh Node.js, Deno, Bun, dan Go dengan server asli Java. Artikel ini membandingkan server asli Node dengan server asli Java.
Semua artikel terbaru dapat dilihat di halaman penulis saya .
Pengaturan
Tes dijalankan pada MacBook Pro M1 dengan RAM 16G.
Versi perangkat lunak adalah:
- Node.js v19.8.1
- Jawa 20
Node.js
import http from "node:http";
http.createServer((req, resp) => {
try {
if (req.method !== "GET") {
return resp.writeHead(405).end();
}
if (req.url !== "/") {
return resp.writeHead(404).end();
}
resp.writeHead(200, {
"content-type": "text/plain",
});
resp.end("Hello world");
} catch (e) {
resp.writeHead(500).end();
}
}).listen(3000);
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class NativeHelloWorldServer {
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(3000), 0);
server.createContext("/", new MyHandler());
server.setExecutor(Executors.newCachedThreadPool());
server.start();
}
static class MyHandler implements HttpHandler {
@Override
public void handle(HttpExchange t) throws IOException {
String response = "Hello world!";
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
}
Setiap pengujian dijalankan untuk 5 juta (5 juta) permintaan.
Tes dijalankan untuk 25, 100, dan 300 koneksi bersamaan.
Uji beban dilakukan dengan menggunakan alat pengujian HTTP Bombardier.
Berikut adalah tabel yang menunjukkan hasil untuk setiap level konkurensi:
Server HTTP asli Node ternyata lebih cepat dari server asli Java. Perbedaannya tidak terlalu jauh entah itu angka RPS atau latency, tapi ada perbedaannya. Juga, Node menggunakan sumber daya sistem yang sangat sedikit seperti CPU dan memori.
PEMENANG: Node.js
Mungkin ada argumen tentang penggunaan kumpulan utas yang di-cache di Jawa. Opsi lainnya adalah mengalokasikan kumpulan utas ukuran tetap di awal. Berikut adalah tes cepat menggunakan 100 koneksi bersamaan dengan kumpulan utas berukuran tetap dari 125 utas. Satu-satunya perubahan baris dalam kode Java adalah:
//server.setExecutor(Executors.newCachedThreadPool());
server.setExecutor(Executors.newFixedThreadPool(125));
Saya tidak melihat peningkatan kinerja apa pun dengan kumpulan utas ukuran tetap.
Pada artikel berikut akan dipaparkan perbandingan dengan Java untuk Deno, Bun, dan Go.
MEMPERBARUI:

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































