Pengoptimuman Array Tidak Perlu dalam PHP
Katakan seorang pengaturcara mempunyai tugas untuk
mencari hasil tambah integer dari 1 hingga 100000000.
Pengaturcara kami menulis penyelesaian yang elegan untuk tugas ini, seperti berikut:
<?php
echo array_sum(range(1, 100000000));
?>
Penyelesaian yang cantik, bukan? Hanya satu baris dan sebagainya. Tetapi ia tidak berfungsi! Cuba jalankan kod ini dan ia akan memaparkan ralat mengenai anda meminta terlalu banyak memori RAM.
Hmm, 100000000 seperti tidak banyak?
Atau banyak? Mari kita kira. Fungsi range
mencipta array dengan 100000000 nombor.
Katakan PHP memperuntukkan 2 bait
untuk setiap nombor - maka untuk menyimpan array kami, diperlukan
200000000 bait, iaitu sekitar
200 megabait memori RAM.
Tetapi sebenarnya, lebih banyak memori RAM diperlukan
kerana PHP mempunyai
perbelanjaan tambahan yang sangat besar ketika menyimpan array.
Sebagai contoh, dalam teks ralat saya, ia mengatakan
saya cuba memperuntukkan 4294967304
bait - sekitar 4 gigabait!
Sekarang jelas mengapa ralat berlaku - kita telah jauh melebihi had memori yang dibenarkan.
Tidak sukar untuk menulis semula skrip kami kepada yang lain, yang hampir tidak menggunakan memori RAM:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
Atau lebih baik, gunakan penyelesaian matematik:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
Seorang pengaturcara mempunyai tugas untuk mencari faktorial bagi nombor yang diberikan. Dia menyelesaikannya seperti berikut:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Terangkan, apa yang salah dengan kod ini. Tulis semula kod kepada versi yang lebih optimum.
Seorang pengaturcara mempunyai tugas untuk mencari
bilangan digit yang boleh digunakan untuk
menulis semua integer dari 1 hingga 1000000.
Dia menyelesaikannya seperti berikut:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Terangkan, apa yang salah dengan kod ini. Tulis semula kod kepada versi yang lebih optimum.
Seorang pengaturcara mempunyai tugas untuk mencari
bilangan nombor yang boleh dibahagi tanpa baki dengan
7, berada dalam julat yang diberikan. Dia menyelesaikannya seperti berikut:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Terangkan, apa yang salah dengan kod ini. Tulis semula kod kepada versi yang lebih optimum.
Seorang pengaturcara mempunyai tugas untuk mencari hasil tambah pembahagi nombor. Dia menyelesaikannya seperti berikut:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Terangkan, apa yang salah dengan kod ini. Tulis semula kod kepada versi yang lebih optimum.