Lazy Collections (tembel koleksiyonlar), Swift 2 ile ortaya çıkan özel bir mekanizmadır; bu mekanizma, koleksiyonlar üzerindeki hesaplamaları sonuçla doğrudan etkileşim anına kadar ertelemeyi mümkün kılar. Başlangıçta koleksiyonların standart yöntemleri (örneğin, map, filter), yeni koleksiyonun tamamen hesaplanmış sonucunu döndürüyorlardı; bu durum, özellikle büyük diziler veya dönüşüm zincirleri ile çalışırken, gereksiz bellek ve zaman israfına yol açabiliyordu.
Sorun, ara koleksiyonların gereksiz yere oluşturulmasıdır. Her map veya filter çağrısı yeni bir veri kopyası oluşturur ki bu da birden fazla dönüşümde programın performansını ciddi derecede düşürür.
Çözüm ise, .lazy özelliğini kullanarak tembel koleksiyonlardır. Swift, tüm işlemleri tek bir zincirde birleştirir ve yalnızca gerçekten erişilen elemanları hesaplar.
Kod örneği:
let array = Array(1...1_000_000) let result = array.lazy.filter { $0 % 2 == 0 }.map { $0 * 3 } print(result.prefix(5)) // Sadece ilk 5 değer hesaplanacak
Anahtar özellikler:
Soru 1: let b = a.lazy.map { ... } hemen hesaplama sonucunu mu döner?
Hayır, .lazy ve map/filter yöntemleri kullanıldığında, hesaplama sonucu yalnızca verilere doğrudan erişimle (örneğin, for-in, first, reduce üzerinden) dönecektir.
Kod örneği:
let array = [1, 2, 3] let mapped = array.lazy.map { x in print("işleniyor\(x)") return x * 2 } // Bu aşamada hiçbir şey yazdırılmaz let first = mapped.first // İşte burada hesaplamalar başlayacak ve çıktı oluşacak
Soru 2: .lazy'den sonra mevcut koleksiyona yeni bir eleman ekleyebilir miyim ve daha sonra erişildiğinde o eleman da işlenir mi?
Hayır, Lazy Collection, tembel görünüm oluşturuş anındaki koleksiyonun durumunu yansıtır. Sonradan eklenen elemanlar dikkate alınmayacaktır.
Soru 3: Küçük koleksiyonlar (<100 eleman) için .lazy kullanımı etkili midir?
Hayır, küçük koleksiyonlar için tembel hesaplamalardan elde edilen kazanç hemen hemen fark edilmez ve bazen ek yükleme performansı olumsuz etkileyebilir.
Projede, küçük koleksiyonlarda bile .lazy’yi düşünmeden tüm map/filter’lara uyguladılar.
Artılar:
Eksiler:
Büyük işlem veritabanlarındaki raporları, uzun dönüşüm zincirlerinin olduğu fonksiyonlar için yalnızca .lazy kullanarak yeniden yapılandırdık.
Artılar:
Eksiler: