Bellek verimliliği
Generator'ların büyük veri setlerinde nasıl bellek tasarrufu sağladığını öğrenirsin.
Generator'lar bellek tasarrufu sağlar
range(1, 1000000) çağrısı bir milyon elemanlı bir dizi oluşturur; tüm değerler belleğe yüklenir. Generator ise her seferinde tek değer üretir ve bellekte tek değer tutar.
memory_get_usage() işleviyle bu farkı görebilirsin. Büyük veri setlerinde generator, diziye göre çok daha az bellek harcar.
Tembel değerlendirme
Generator her yield'de durur. Değer ancak foreach veya next() ile istendiğinde üretilir. Bu yüzden büyük veri setleri belleğe yüklenmeden akışkan biçimde işlenir.
Dosya satır satır okunabilir, ağ verisi parça parça alınabilir. Ara diziler oluşmaz; her seferinde tek değer belleğe gelir, işlenir ve bırakılır.
Uygulama Kareler generator'ını yaz
squares(int $n): \Generator fonksiyonu yaz: 1'den $n'ye kadar her sayının karesini yield ile üret. foreach ile squares(5) yinele ve her kareyi yazdır.
Örnek çözümü göster
int $n alsın, \Generator döndürsün. for döngüsü ile 1'den $n'ye kadar sayıların karesini yield ile üret. Sonra foreach (squares(5) as $square) ile yinele ve echo $square . "\n"; yaz.
Örnek çözüm:
<?php
function squares(int $n): \Generator {
for ($i = 1; $i <= $n; $i++) {
yield $i * $i;
}
}
foreach (squares(5) as $square) {
echo $square . "\n";
}
Kendini test et
-
range(1, 1000000) çağrısında ne olur?
- Hiçbir şey, fonksiyon boş döner
- Yalnızca ilk değer döner
- Bir milyon elemanlı dizi bellekte oluşturulur
- Generator döner, değerler tembel üretilir
Cevabı göster
Bir milyon elemanlı dizi bellekte oluşturulur — Doğru. range() tüm değerleri bir diziye yükler; generator gibi tembel üretmez.
-
Bellek kullanımını ölç
$before = ____(true); foreach (squares(5) as $s) { echo $s . "\n"; } $after = memory_get_usage(true);Cevabı göster
$before = memory_get_usage(true); foreach (squares(5) as $s) { echo $s . "\n"; } $after = memory_get_usage(true); -
Bellek kavramlarını eşleştir
- range()
- Tüm değerleri diziye yığar
- Generator
- Tek seferde tek değer üretir
- yield
- Değeri tembel üretir
- memory_get_usage
- Bellek kullanımını ölçer