Apakah Laravel Selambat Itu?
• 4 menit
Beberapa kali saya mendengar komplain orang terkait lambatnya framework yang satu ini.
Saya pribadi menyukai framework Laravel. Fiturnya lengkap, package banyak, development pun juga cepat.
Tapi, kini trend sudah mulai bergeser. Dengan alasan framework Laravel yang lambat, banyak programmer yang berpindah menggunakan teknologi lain seperti Golang ataupun Java Spring yang dikenal memiliki performa tinggi.
Hal ini membuat saya bertanya-tanya: benarkah Laravel selambat itu?
Untuk menjawab hal ini, saya melakukan benchmarking, dan hasilnya saya bagikan di bawah ini.
Mengapa benchmarking?
Benchmarking ini tidak dilakukan untuk mengatakan “framework X lebih baik daripada framework Y!”.
Saya melakukan benchmarking ini untuk mengetahui bagaimana sebenarnya performa kecepatan dari Laravel.
Bagaimana ekspektasi yang dapat saya pasang ketika ingin menggunakan framework ini.
Dan semacamnya.
Bagaimana benchmarking dilakukan?
Simpel, saya membuat sebuah API endpoint dengan menggunakan Laravel, lalu saya melakukan stress testing dengan menggunakan library Stressless.
Tapi, endpoint yang saya buat bukanlah sebuah endpoint “Hello, World!” karena endpoint seperti ini tidak terlalu berguna di dunia nyata…
Saya membuat sebuah endpoint yang perlu melakukan query data yang cukup banyak.
Saya menggunakan dataset pertandingan tenis yang saya ambil dari Kaggle, dimana tabel yang saya gunakan adalah tabel players (> 64 ribu baris) dan tabel rankings (> 3,2 juta baris).
Query yang saya gunakan sendiri adalah:
Tampilkan data terbaru dari 20 pemain dengan ranking teratas.
Jika dibuat ke SQL, maka querynya kurang lebih akan seperti berikut:
SELECT
rankings.rank AS rank,
players.name_first || " " || players.name_last AS name
FROM
rankings
INNER JOIN
players ON rankings.player = players.player_id
WHERE
rankings.ranking_date = (SELECT MAX(rankings.ranking_date) FROM rankings)
ORDER BY
rankings.ranking_date DESC,
rankings.rank ASC
LIMIT
20;
Komputer yang digunakan sendiri memiliki spesifikasi:
- Prosesor 11th Gen Intel(R) Core(TM) i7-1165G7
- RAM 16 GB
Percobaan
Case #1: Default
Saya tidak melakukan custom setting apapun dan hanya menggunakan development server bawaan dari Laravel:
Dapat dilihat, Laravel lambat by-default.
Server hanya dapat menghandle 2,23 request/detik dengan rata-rata durasi tiap request adalah 450 ms.
Berikut adalah log dari server:
Waktu rata-rata query data sendiri membutuhkan waktu kurang lebih 350 ms untuk tiap request, atau dengan kata lain 77,78% waktu tiap request habis pada proses pengambilan data.
Untuk mengatasi problem ini, cukup jelas kita perlu mengurangi waktu dalam tahap query data itu sendiri.
Case #2: Dengan cache
Di case ini saya menambahkan mekanisme caching di dalam server (menggunakan file driver):
Hasil menunjukkan bahwa dengan menggunakan cache, server kini dapat menghandle load sebesar 11 request/detik.
Sedangkan waktu rata-rata request menurun menjadi 89,74 ms, atau sekitar 19,78% dari waktu yang dibutuhkan case sebelumnya.
Tidak buruk!
Waktu rata-rata query data sendiri menurun ke kisaran 6 ms, atau sekitar 1,71% dari waktu yang dibutuhkan server pada case #1.
Hal ini dapat terjadi karena server tidak perlu lagi untuk melakukan query database di setiap request-nya.
Case #3: Dengan Laravel Octane
Jika kalian belum familiar dengan package ini, singkatnya dengan menggunakan Laravel Octane, server akan dapat menghandle request dengan lebih cepat, dengan cara:
- Re-use aplikasi, sehingga Laravel tidak perlu melakukan bootstrapping aplikasi setiap kali ada request baru
- Menggunakan banyak worker sesuai dengan jumlah CPU core yang dimiliki komputer untuk menghandle request.
Hasil setelah menggunakan package ini adalah seperti berikut:
Server kini dapat menghandle hingga 261 request/detik.
Dengan waktu rata-rata per requestnya sendiri adalah 2,96 ms, atau sekitar 0,53% dari waktu yang dibutuhkan server pada case #1.
Sedangkan untuk waktu dari query data sendiri kurang lebih mirip dengan yang ada pada case #2.
Pembahasan
Dari hasil yang didapat, bisa kita lihat bahwa sebagian besar waktu dari sebuah request habis pada proses pengambilan data.
Artinya, dengan menggunakan bahasa atau framework apapun, jika query yang digunakan kompleks (atau buruk) seperti yang terdapat di atas, otomatis waktu pemrosesan request juga akan berjalan dengan lebih lambat.
Sehingga, cache sangat berperan penting untuk bisa meningkatkan performa dari aplikasi.
Selain itu, penggunaan banyak core CPU juga dapat meningkatkan performa server secara drastis.
Kesimpulan
- Laravel tidak selambat itu (bahkan bisa cepat juga)
- Sebisa mungkin cache data yang sering diakses
- Apapun bahasa/framework-nya, gunakan server khusus production pada environment deployment. Jangan gunakan development server.
- Deployment seringkali membutuhkan beberapa konfigurasi sebelum bisa mendapatkan hasil yang optimal. Jangan ragu untuk bereksperimen.
Pertanyaan
“Apakah server di percobaan ini sudah sangat optimal?”
Belum. Masih banyak optimalisasi yang bisa dilakukan lagi.
Contoh, cache pada aplikasi masih menggunakan file. Untuk performa yang lebih bagus lagi, cache berbasis memori seperti Redis atau Memcached dapat digunakan.
Penelitian ini masih menggunakan engine SQLite. Untuk menghandle aplikasi nyata, gunakan database lain yang lebih tinggi performanya seperti MySQL atau PostgreSQL.
Dan masih banyak hal lain yang masih dapat dimodifikasi. Sesuaikan dengan kebutuhan.
“Apakah saya harus menggunakan Laravel?”
Tidak juga, gunakan framework yang kalian/tim kalian sendiri sudah nyaman menggunakannya😉
- Golang? Bagus!
- Java Spring? Boleh juga.
- Express.js? Juga bisa.
“Apakah 200+ request/detik cukup untuk aplikasi saya?”
Lakukan pengukuran sebelum melakukan optimalisasi yang lebih advanced. Tentukan tempat dimana pengoptimalisasi cocok untuk dilakukan sehingga bisa dicapai hasil yang maksimal.
Hal ini belum tentu sama antara project-project yang berbeda🤔
Jika kalian membuat website “normal”, Laravel cukup memadai.
Jika kalian yakin bahwa performaâš¡ yang diperlukan lebih tinggi lagi, pertimbangkan untuk menggunakan Go, Java, atau bahkan C/C++/Rust.
Sekian
Semoga bermanfaat dan sampai jumpa👋