CodeBlanks Logo Icon CodeBlanks

Bellek verimliliği

PHP kursu · Uzman · Ders 3/54

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

  1. 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.

  2. 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);
    
  3. 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

Uzman bölümündeki tüm dersler