PHP'de Gereksiz Dizilerin Optimizasyonu
Bir programcının önünde, 1'den 100000000'e kadar olan tam sayıların toplamını bulma görevi olduğunu varsayalım.
Programcımız bu sorunun zarif bir çözümünü yazdı, işte şöyle:
<?php
echo array_sum(range(1, 100000000));
?>
Güzel bir çözüm, değil mi? Tek satırda ve hepsi bu. Ama çalışmıyor! Bu kodu çalıştırmayı deneyin ve çok fazla RAM talep ettiğinizle ilgili bir hata mesajı verecek.
Hmm, 100000000 çok fazla gibi görünmüyor? Yoksa fazla mı? Hesaplayalım. range fonksiyonu 100000000 sayı içeren bir dizi oluşturur. PHP'nin bir sayı için 2 bayt ayırdığını varsayalım - bu durumda dizimizi saklamak için 200000000 bayt, yani yaklaşık 200 megabayt RAM gerekecek.
Ama aslında, PHP'de bir diziyi saklarken çok yüksek ek yükler olduğundan çok daha fazla RAM gerekecek. Örneğin, bana verdi hata mesajında, 4294967304 bayt - yaklaşık 4 gigabayt! - ayırmaya çalıştığımı söylüyor.
Şimdi neden hata aldığımız açık - izin verilen bellek sınırının çok ötesine geçtik.
Betiğimizi, neredeyse hiç RAM tüketmeyen başka bir betiğe yeniden yazmak o kadar da zor değil:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
Ya da daha iyisi matematiksel çözümü kullanırız:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
Bir programcının önünde, verilen bir sayının faktöriyelini bulma görevi vardı. Bunu şu şekilde çözdü:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Bu kodda neyin yanlış olduğunu açıklayın. Kodu daha optimize hale getirin.
Bir programcının önünde, 1'den 1000000'e kadar olan tüm tam sayıları yazmak için kullanılabilecek rakamların sayısını bulma görevi vardı.
Bunu şu şekilde çözdü:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Bu kodda neyin yanlış olduğunu açıklayın. Kodu daha optimize hale getirin.
Bir programcının önünde, belirli bir aralıkta kalan ve 7'ye kalansız bölünebilen sayıların adedini bulma görevi vardı.
Bunu şu şekilde çözdü:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Bu kodda neyin yanlış olduğunu açıklayın. Kodu daha optimize hale getirin.
Bir programcının önünde, bir sayının bölenlerinin toplamını bulma görevi vardı. Bunu şu şekilde çözdü:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Bu kodda neyin yanlış olduğunu açıklayın. Kodu daha optimize hale getirin.