Laravel 6 sudah beberapa minggu ini release. Tentu ada beberapa update fitur-fitur keren yang patut dicoba.
Yang paling menarik perhatian saya adalah Lazzy Collection.
Daftar Isi
Dari beberapa pengalaman membuat aplikasi selama ini, dalam Laravel, jika ingin me-load data dalam jumlah besar sekaligus maka membuat memory usagenya menjadi membengkak. Ujung-ujungnya bisa membuat server down kalau tidak kuat.
Jadi lazzy collection ini sepertinya menjadi sebuah jawaban keresahan saya selama ini. hahaha ~
Kita akan melakukan testing aja. Testingnya sangat sederhana. Mungkin di komputer berbeda tapi tujuannya hanya ingin tahu perbandingan kalau pakai collection biasa memory usagenya berapa, kalau pakai lazzy collection memory usagenya berapa.
Yuk kita mulai saja.
Step 1. Install laravel 6
create-project --prefer-dist laravel/laravel testing 6.0
Jika sudah terinstall, install juga depedency yang dibutuhkan.
Untuk info mengenai cara install laravel lebih lanjut bisa akses: https://laravel.com/docs/
Step 2. Install debugbar untuk melihat memory usage.
Jika laravel sudah terinstall, tambahkan package debugbar.
composer require barryvdh/laravel-debugbar --dev
Jika laravel sudah terinstall, kamu buka di browser dan harusnya muncul tampilan awal laravel dengan debugbar disebelah bawah.
Step 2. Dummy data & routing
Selanjutnya? Kita perlu dummy data untuk testing. Kita akan generate lewat seeder.
Edit file DatabaseSeeder.php untuk membuat dumy user dengan menggunakan UserFactory.php yang sudah ada.
<?php
use App\User;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
factory(User::class, 100000)
->create();
}
}
Run migration dan seeder.
php artisan migrate:install
php artisan db:seed
Kamu bisa cek jika table sudah berhasil di migrate dan data user sudah terisi.
Buat 2 route baru untuk testing collection biasa dan lazzy collection.
<?php
Route::get('/', function () {
$users = \App\User::cursor();
foreach ($users as $key => $value) {
echo $value->id;
}
return 1;
});
Route::get('/2', function () {
$users = \App\User::all();
foreach ($users as $key => $value) {
echo $value->id;
}
return 1;
});
Jadi route pertama : http://127.0.0.1:800/ akan menggunakan lazzy collection dan http://127.0.0.1:800/2 akan menggunakan normal collection.
Saatnya testing.
Kita lihat perbedaan masing-masing penggunaan memorinya lewat gambar di bawah ini.
Yang kanan lazzy collection. Yang kiri collection biasa.
Untuk load 100.000 data, lazz collection memakai memory 70.22MB sedangkan collection biasa 150.25MB
Ternyata hampir mengurangi setengah kebutuhan ram dibandingkan dengan collection biasa. Keren.
Untuk load 10.000 data, lazz collection memakai memory 7.5MB sedangkan collection biasa 11.17MB
Perbedaan memory usage hampir 50% juga.
Untuk load 1000 data, lazz collection memakai memory 4.5MB sedangkan collection biasa 5.18MB
Untuk data yang 1000 ke bawah perbedaan memory usagenya tidak terlalu besar sih, tapi masih lebih kecil lazzy loading.
Kesimpulan
Lazzy Collection terbukti mengurangi penggunaan memori saat membutuhkan data besar yang akan diload sekaligus. Tentu ini menjadi sebuah kabar bagi para artisan. Walaupun secara best practice load data sekaligus tidak dianjurkan, maka dengan lazzy collection ini penggunaan memory jadi lebih hemat.