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.
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.
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")
} 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)
| Metrik | Go Fiber | Express |
|---|---|---|
| Throughput (median) | 25.862 req/s | 12.260 req/s |
| Rentang 5 putaran | 17.232 – 27.207 | 12.125 – 12.398 |
| Latency p50 | 3,2 ms | 7,9 ms |
| Latency p99 | 13,2 ms | 11,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
clusteratau 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:
- Pastikan Go dan Node.js sudah terpasang (
go versiondannode -v). - Buat dan jalankan kedua server:
# 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 - Pasang
hey, lalu uji setiap server bergantian, bukan bersamaan:
# 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 - Ganti port
3001menjadi3002untuk menguji Express. - Catat baris
Requests/secdanLatency distributiondari 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.
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.