Kembali ke Blog
Backend 6 menit baca

Go Fiber vs Express.js: Benchmark Performa REST API Secara Langsung

Saya mengukur sendiri throughput, latency, dan pemakaian memori Go Fiber dan Express.js di laptop yang sama. Berikut hasilnya, cara mengulanginya, dan kapan sebaiknya memilih masing-masing.

L

Maulana Nur Anfajm

Software Engineer

Ringkasan

  • Untuk respons JSON berisi 50 data, Go Fiber melayani sekitar 2,1 kali lebih banyak permintaan per detik dibanding Express (± 25.900 vs ± 12.300).
  • Pemakaian memori Fiber jauh lebih kecil: sekitar 8 MB saat diam dan 18 MB saat dibebani, sedangkan Express sekitar 68 MB dan 104 MB.
  • Latency pada persentil 99 keduanya mirip, sekitar 12–13 ms.
  • Pada skenario teks pendek, hasil Fiber di laptop saya tidak stabil, jadi saya tidak menarik kesimpulan dari skenario itu.

Apa yang diukur?

Tiga hal yang paling relevan untuk sebuah REST API:

  • Throughput (req/s): berapa permintaan yang bisa dilayani per detik. Makin besar makin baik.
  • Latency p50 dan p99: waktu tunggu satu permintaan. p50 adalah waktu tunggu umum; p99 adalah waktu tunggu 1% permintaan paling lambat. Makin kecil makin baik.
  • Memori: RAM yang dipakai proses server saat diam dan saat dibebani.

Ada dua skenario. /hello mengirim teks pendek, sedangkan /users membuat 50 objek lalu mengirimnya sebagai JSON. Skenario kedua lebih mendekati API sungguhan.

Kode yang diuji

Kedua server dibuat sesederhana dan seadil mungkin: logika sama, tanpa database, tanpa middleware tambahan.

fiber/main.go
package main

import "github.com/gofiber/fiber/v2"

type User struct {
	ID    int    `json:"id"`
	Name  string `json:"name"`
	Email string `json:"email"`
}

func main() {
	app := fiber.New(fiber.Config{DisableStartupMessage: true})

	// Skenario 1: teks pendek
	app.Get("/hello", func(c *fiber.Ctx) error {
		return c.SendString("Hello, World!")
	})

	// Skenario 2: daftar 50 user dalam bentuk JSON
	app.Get("/users", func(c *fiber.Ctx) error {
		users := make([]User, 0, 50)
		for i := 1; i <= 50; i++ {
			users = append(users, User{ID: i, Name: "User", Email: "user@example.com"})
		}
		return c.JSON(users)
	})

	app.Listen("127.0.0.1:3001")
}
express/server.js
const express = require("express");
const app = express();

// Skenario 1: teks pendek
app.get("/hello", (req, res) => res.send("Hello, World!"));

// Skenario 2: daftar 50 user dalam bentuk JSON
app.get("/users", (req, res) => {
  const users = [];
  for (let i = 1; i <= 50; i++) {
    users.push({ id: i, name: "User", email: "user@example.com" });
  }
  res.json(users);
});

app.listen(3002, "127.0.0.1");

Lingkungan pengujian

  • Laptop: Intel Core i3-1115G4 (2 core, 4 thread), RAM 8 GB, Windows 11.
  • Versi: Go 1.27.3 + Fiber v2.52.16; Node.js 26.12.1 + Express 5.3.0.
  • Alat uji: hey, 100 koneksi bersamaan, 15 detik per putaran, 5 putaran per skenario setelah pemanasan 5 detik. Angka yang ditampilkan adalah median dari 5 putaran.
  • Memori: working set proses server, dicatat setiap 1,5 detik selama pengujian.

Hasil

Skenario /users (JSON, 50 data)

MetrikGo FiberExpress
Throughput (median)25.862 req/s12.260 req/s
Rentang 5 putaran17.232 – 27.20712.125 – 12.398
Latency p503,2 ms7,9 ms
Latency p9913,2 ms11,7 ms
Memori puncak± 18 MB± 103 MB

Memori saat diam

Begitu server dinyalakan dan belum menerima permintaan apa pun, Fiber memakai sekitar 8 MB, sedangkan Express sekitar 68 MB. Sebagian besar selisih ini berasal dari runtime: Go menghasilkan satu program yang sudah dikompilasi, sedangkan Node.js membawa mesin JavaScript V8 beserta JIT compiler-nya.

Skenario /hello (teks pendek)

Express stabil di sekitar 14.700 req/s (rentang 14.505 – 14.875). Hasil Fiber justru melompat-lompat antara 5.278 dan 27.285 req/s dalam lima putaran. Pada percobaan sebelumnya pun angkanya bisa mencapai 44.000 req/s. Karena variasinya terlalu besar, angka skenario ini tidak saya pakai untuk membandingkan.

Cara membaca hasil ini

  • Selisih 2 kali lipat belum tentu terasa oleh pengguna. Di aplikasi sungguhan, waktu terbesar biasanya habis untuk menunggu database atau layanan lain. Jika satu query butuh 20 ms, perbedaan 4–5 ms di framework menjadi relatif kecil.
  • Memori adalah keunggulan Fiber yang paling konsisten. Di server kecil seperti EC2 t2.micro (RAM 1 GB), selisih puluhan MB per proses cukup berarti, terutama jika menjalankan beberapa service sekaligus.
  • Express di sini hanya memakai satu thread. Node.js bisa menjalankan beberapa proses sekaligus (misalnya dengan cluster atau PM2) untuk memakai semua core. Throughput-nya akan naik, tetapi pemakaian memorinya juga ikut berlipat.
  • Ini benchmark sederhana. Hasilnya hanya mengukur biaya dasar framework, tanpa database dan logika bisnis.

Jadi, pilih yang mana?

Pilih Go Fiber jika…

  • Server kecil dan RAM terbatas.
  • Butuh throughput tinggi atau banyak pekerjaan berat di CPU.
  • Ingin hasil build berupa satu file yang mudah di-deploy.
  • Tim nyaman dengan bahasa bertipe statis.

Pilih Express jika…

  • Tim sudah terbiasa dengan JavaScript/TypeScript.
  • Ingin berbagi kode dan tipe data dengan frontend.
  • Butuh ekosistem paket npm yang sangat luas.
  • Kecepatan membuat fitur lebih penting daripada efisiensi server.

Untuk Letta School, saya tetap memilih Fiber karena aplikasinya berjalan di EC2 dengan RAM 1 GB bersama PostgreSQL, Nginx, dan frontend. Hemat memori di sana lebih berharga daripada selisih throughput-nya.

Coba ulangi sendiri

Angka di laptopmu pasti berbeda, jadi bandingkan rasio antara keduanya. Berikut langkahnya:

  1. Pastikan Go dan Node.js sudah terpasang (go version dan node -v).
  2. Buat dan jalankan kedua server:
Terminal
# Server Go Fiber
mkdir fiber && cd fiber
go mod init bench/fiber
go get github.com/gofiber/fiber/v2
# simpan kode di atas sebagai main.go, lalu:
go build -o fiber .
./fiber

# Server Express (di terminal lain)
mkdir express && cd express
npm init -y
npm install express@5
# simpan kode di atas sebagai server.js, lalu:
node server.js
  1. Pasang hey, lalu uji setiap server bergantian, bukan bersamaan:
Terminal
# Pasang alat uji beban "hey"
go install github.com/rakyll/hey@latest

# Pemanasan 5 detik (hasilnya diabaikan)
hey -z 5s -c 100 http://127.0.0.1:3001/users

# Pengukuran: 100 koneksi bersamaan selama 15 detik, diulang 5 kali
hey -z 15s -c 100 http://127.0.0.1:3001/users
  1. Ganti port 3001 menjadi 3002 untuk menguji Express.
  2. Catat baris Requests/sec dan Latency distribution dari setiap putaran, lalu ambil mediannya.

Kesimpulan

Dalam pengujian ini, Go Fiber unggul jelas dalam throughput respons JSON (sekitar 2 kali lipat) dan pemakaian memori (sekitar 6 kali lebih hemat). Express tetap pilihan yang masuk akal untuk tim yang sudah terbiasa dengan JavaScript. Kalau performa jadi pertimbangan utama di proyekmu, jalankan pengujian di atas dengan endpoint dan server milikmu sendiri.

Go FiberExpress.jsNode.jsBackendBenchmark
L

Maulana Nur Anfajm (Lananuranf)

Software Engineer dan mahasiswa Sistem Informasi semester 7 di Universitas Gunadarma. Membangun aplikasi web dengan React, TypeScript, Go, dan PostgreSQL.

Lihat portfolio →

Ada pertanyaan atau masukan?

Silakan hubungi saya. Saya dengan senang hati membantu dan berdiskusi lebih lanjut.