Mengoptimasi performa ElysiaJS: benchmarking dengan autocannon dan bombardier, optimization techniques seperti pre-compile schema dan connection pooling, profiling dengan Bun --inspect, dan caching strategy.

Setelah di episode 15 kita meng-setup OpenAPI documentation, pada episode ini kita akan memahami cara mengoptimasi performa ElysiaJS — krusial untuk high-traffic API di mana setiap milidetik latency berdampak pada user experience dan biaya infrastruktur.
bun add -g autocannonautocannon -c 100 -d 10 http://localhost:3000Parameter -c 100 artinya 100 koneksi concurrent, -d 10 artinya durasi 10 detik. Target untuk simple route di Bun: 500k+ req/s.
Jangan hanya benchmark route kosong. Benchmark dengan kondisi realistis:
autocannon -c 100 -d 10 -m POST \
-H "Content-Type=application/json" \
-b '{"name":"test","email":"test@example.com"}' \
http://localhost:3000/usersElysiaJS secara otomatis cache schema validation, tetapi kalian bisa memastikan schema di-pre-compile:
import { Elysia, t } from 'elysia'
// Schema didefinisikan di level modul — di-cache oleh ElysiaJS
const createUserSchema = t.Object({
name: t.String(),
email: t.String({ format: 'email' }),
})
const app = new Elysia()
.post('/users', handler, { body: createUserSchema })import { Pool } from 'pg'
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
max: 20,
idleTimeoutMillis: 30000,
})Jangan buka/tutup koneksi per request — ini sangat mahal.
bun add @elysiajs/compressimport compress from '@elysiajs/compress'
const app = new Elysia()
.use(compress())bun --inspect src/index.tsBuka chrome://inspect di Chrome DevTools untuk profiling CPU dan memory.
Monitor RSS (Resident Set Size) di production:
ps aux | grep bun | grep -v grepRSS tidak boleh terus meningkat tanpa batas — ini indikasi memory leak.
const cache = new Map<string, { data: any, expiry: number }>()
function getCached(key: string, ttl: number) {
const cached = cache.get(key)
if (cached && cached.expiry > Date.now()) {
return cached.data
}
return null
}.get('/data', ({ set }) => {
set.headers['Cache-Control'] = 'public, max-age=3600'
return { data: 'expensive computation' }
})Untuk multiple instances, gunakan Redis:
import Redis from 'ioredis'
const redis = new Redis(process.env.REDIS_URL)
app.get('/data', async () => {
const cached = await redis.get('data')
if (cached) return JSON.parse(cached)
const data = await expensiveQuery()
await redis.set('data', JSON.stringify(data), 'EX', 3600)
return data
})Note
Caching harus diterapkan secara selektif. Data yang sering berubah (real-time) sebaiknya tidak di-cache. Data yang jarang berubah (configuration, reference data) sangat cocok untuk caching agresif.
Pada episode 16 ini, kalian telah memahami cara mengoptimasi performa ElysiaJS — dari benchmarking hingga caching strategy.
Inti yang harus dibawa pulang:
Di episode 17 selanjutnya kita akan memahami testing dengan Bun test dan supertest — unit testing, integration testing, E2E testing, dan code coverage. Sampai jumpa di episode 17!