Go vs Java: Perbandingan performa server HTTP asli untuk kasus hello world

Apr 18 2023
Artikel terbaru tentang seri perbandingan kinerja menjadi cukup populer di komunitas menengah. Awalnya saya melakukan perbandingan antara server native Node/Deno/Bun dengan SpringBoot.

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:

Semua artikel terbaru dapat dilihat di halaman penulis media saya .

Pengaturan

Tes dijalankan pada MacBook Pro M1 dengan RAM 16G.

Versi perangkat lunak adalah:

  • Buka v1.20.2
  • Jawa 20

Pergi

package main

import (
  "io"
  "net/http"
)

func main() {
  http.HandleFunc("/", helloWorld)
  http.ListenAndServe(":3000", nil)
}

func helloWorld(w http.ResponseWriter, r *http.Request) {
  io.WriteString(w, "Hello world!")
}

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 10, 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 Go ternyata jauh lebih cepat daripada server asli Java. Perbedaannya cukup signifikan entah itu RPS, latensi atau sumber daya sistem. Mengenai sumber daya sistem, penggunaan CPU Go cukup tinggi. Namun, penggunaan memori Go (~25M) tidak ada apa-apanya jika dibandingkan dengan penggunaan memori Java (~400M).

PEMENANG: Pergi

Artikel lain yang tersedia: