Bun 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 seri ini, saya akan membandingkan server asli yang disediakan oleh Node.js, Deno, Bun, dan Go dengan Java. Artikel lainnya adalah:
- Node.js vs Java: Perbandingan server HTTP hello world asli
- Deno vs Java: Perbandingan server HTTP asli hello world
- Go vs Java: Perbandingan server HTTP asli hello world
Semua artikel terbaru dapat dilihat di halaman penulis saya .
Pengaturan
Tes dijalankan pada MacBook Pro M1 dengan RAM 16G.
Versi perangkat lunak adalah:
- Bun v0.5.8
- Jawa 20
Sanggul
Bun.serve({
port: 3000,
fetch(req) {
try {
if (req.method !== "GET") {
return new Response(null, { status: 405 });
}
const pathName = new URL(req.url).pathname;
if (pathName !== "/") {
return new Response(null, { status: 404 });
}
return new Response("Hello world");
} catch (e) {
return new Response(null, { status: 500 });
}
},
});
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:
Nah, server HTTP asli Bun ternyata jauh lebih cepat daripada server asli Java. Perbedaannya cukup signifikan entah itu RPS, latensi atau sumber daya sistem. Juga, Bun menggunakan sumber daya sistem yang sangat sedikit seperti CPU dan memori untuk menawarkan RPS yang lebih baik. Terutama, penggunaan memori Bun (~30M) tidak ada apa-apanya jika dibandingkan dengan penggunaan memori Java (~400M).
Saya percaya alasan utamanya adalah server tidak melakukan banyak hal. Sebagian besar terikat I/O. Ketika segalanya menjadi rumit, saya kira Java harus mengungguli Node.js, Deno, dan Bun.
PEMENANG: Bun
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 yang signifikan dengan kumpulan utas ukuran tetap.
Pada artikel berikut, perbandingan dengan Java akan disajikan untuk Go.
Artikel lain yang tersedia:

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



































