Optimisasi Array yang Tidak Perlu dalam PHP
Misalkan seorang programmer dihadapkan pada tugas
menjumlahkan bilangan bulat dari 1 hingga 100000000.
Programmer kita menulis solusi yang elegan untuk tugas ini, seperti ini:
<?php
echo array_sum(range(1, 100000000));
?>
Solusi yang cantik, bukan? Hanya dalam satu baris dan semuanya. Tapi itu tidak bekerja! Cobalah menjalankan kode ini dan dia akan menampilkan kesalahan tentang meminta terlalu banyak memori RAM.
Hmm, 100000000 sepertinya tidak terlalu banyak?
Atau banyak? Mari kita hitung. Fungsi range
membuat array dengan 100000000 angka.
Misalkan PHP mengalokasikan 2 byte
untuk satu angka - maka untuk menyimpan array kita dibutuhkan
200000000 byte, yaitu sekitar
200 megabyte memori RAM.
Tapi sebenarnya memori RAM yang dibutuhkan akan
jauh lebih banyak karena dalam PHP ada
overhead yang sangat besar saat menyimpan array.
Sebagai contoh, di teks error saya, dilaporkan
bahwa saya mencoba mengalokasikan 4294967304
byte - sekitar 4 gigabyte!
Jelas sekarang, mengapa errornya muncul - kita jauh melampaui batas memori yang diizinkan.
Tidak terlalu sulit untuk menulis ulang skrip kita menjadi yang lain, yang hampir tidak mengonsumsi memori RAM:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
Atau lebih baik lagi kita gunakan solusi matematis:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
Seorang programmer dihadapkan pada tugas mencari faktorial dari suatu angka. Dia menyelesaikannya dengan cara berikut:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Jelaskan, apa yang salah dengan kode ini. Ubahlah kode menjadi lebih optimal.
Seorang programmer dihadapkan pada tugas mencari
jumlah digit yang dapat digunakan untuk
menulis semua bilangan bulat dari 1 hingga 1000000.
Dia menyelesaikannya dengan cara berikut:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Jelaskan, apa yang salah dengan kode ini. Ubahlah kode menjadi lebih optimal.
Seorang programmer dihadapkan pada tugas mencari
jumlah angka yang habis dibagi
7, yang berada dalam
rentang tertentu. Dia menyelesaikannya dengan cara berikut:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Jelaskan, apa yang salah dengan kode ini. Ubahlah kode menjadi lebih optimal.
Seorang programmer dihadapkan pada tugas mencari jumlah dari pembagi suatu angka. Dia menyelesaikannya dengan cara berikut:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Jelaskan, apa yang salah dengan kode ini. Ubahlah kode menjadi lebih optimal.