PHP-de gereksiz massiwleri optimizasiýa etmek
Bir programmistde, 1-den 100000000-a çenli bolan bitin sanlaryň jemini tapmak meselesi bardy diýeliň.
Bizim programmist bu meseläniň gözel çözgüdini ýazdy, şeýle:
<?php
echo array_sum(range(1, 100000000));
?>
Gözel çözgüt, dälmi? Bir setirdä we şuňa meňzeş. Ýöne bu işlemeýär! Bu kody işlediň we ol ekrana näçe köp operativ ýat talap edýändigiňiz hakda ýalňyşlyk çykarar.
Hmm, 100000000 näçe köp däl? Ýa-da köpmi? Hasaplalyň. range funksiýasy 100000000 sanly massiw döredýär. PHP-niň bir sana üçin 2 baýt bölüp berýändigini diýeliň - onda bizim massiwimizi saklamak üçin 200000000 baýt, ýagny takmynan 200 megabaýt operativ ýat gerek bolar.
Ýöne aslynda PHP-de massiw saklananda aýratyn giderler çoň bolany üçin operativ ýat has köp gerek bolar. Mysal üçin, ýalňyşlyk tekstimde, 4294967304 baýt, ýagny takmynan 4 gigabaýt bölüp bermäge synanyşýandygym görkezilýär!
Indi ýalňyşlyk näme üçin ýüze çykýandygyny düşündik - rugsat berlen ýat çägininden gaty daşaryk çykdyk.
Bu skripti praktiki ýaly operativ ýat sarp etmeýän başga birine ýazmak oňat däl:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
Ýa-da has gowusy matematiki çözgütden peýdalanyň:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
Bir programmistde, berlen sanyň faktorialyny tapmak meselesi bardy. Ony aşakdaky ýaly çözdü:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Bu kodda nämäniň nädogrydygyny düşündiriň. Kody has optimala üýtgediň.
Bir programmistde, 1-den 1000000-a çenli bolan ähli bitin sanlary ýazmak üçin näçe san ulanylyp bilinýändigini tapmak meselesi bardy. Ony aşakdaky ýaly çözdü:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Bu kodda nämäniň nädogrydygyny düşündiriň. Kody has optimala üýtgediň.
Bir programmistde, berlen aralykda galyndysyz 7-e bölünýän sanlaryň sanyny tapmak meselesi bardy. Ony aşakdaky ýaly çözdü:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Bu kodda nämäniň nädogrydygyny düşündiriň. Kody has optimala üýtgediň.
Bir programmistde, bir sanyň bölüjileriniň jemini tapmak meselesi bardy. Ony aşakdaky ýaly çözdü:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Bu kodda nämäniň nädogrydygyny düşündiriň. Kody has optimala üýtgediň.