Lazy Collections (luie collecties) zijn een speciaal mechanisme dat in Swift 2 is geïntroduceerd en dat het mogelijk maakt om berekeningen op verzamelingen uit te stellen tot het moment dat daadwerkelijk naar het resultaat wordt verwezen. Oorspronkelijk gaven de standaardmethoden van verzamelingen (zoals map, filter) een volledig berekend resultaat van een nieuwe verzameling terug, wat soms leidde tot onnodige geheugen- en tijdskosten, vooral bij het werken met grote arrays of ketens van transformaties.
Probleem ligt in de overmatige creatie van tussentijdse verzamelingen. Elke aanroep van map of filter creëert een nieuwe kopie van de gegevens, wat de prestaties van het programma merkbaar verlaagt bij meerdere transformaties.
Oplossing — gebruik luie collecties met behulp van de eigenschap .lazy. Swift combineert alle bewerkingen in één keten en berekent alleen die elementen waartoe daadwerkelijk wordt verwezen.
Voorbeeldcode:
let array = Array(1...1_000_000) let result = array.lazy.filter { $0 % 2 == 0 }.map { $0 * 3 } print(result.prefix(5)) // Alleen de eerste 5 waarden worden berekend
Belangrijkste kenmerken:
Vraag 1: Geeft let b = a.lazy.map { ... } meteen het resultaat van de berekening terug?
Nee, bij gebruik van .lazy en de methoden map/filter wordt het resultaat van de berekening alleen teruggegeven bij directe verwijzing naar de gegevens (bijvoorbeeld via for-in, first, reduce).
Voorbeeldcode:
let array = [1, 2, 3] let mapped = array.lazy.map { x in print("processing\(x)") return x * 2 } // Op dit punt wordt er nog niets weergegeven let first = mapped.first // Hier beginnen de berekeningen en verschijnt de output
Vraag 2: Is het mogelijk om na .lazy een nieuw element aan de oorspronkelijke verzameling toe te voegen en zal dit ook worden verwerkt als later naar het resultaat wordt verwezen?
Nee, Lazy Collection weerspiegelt de status van de verzameling op het moment dat de luie weergave is gemaakt. Later toegevoegde elementen worden niet meegerekend.
Vraag 3: Is het gebruik van .lazy effectief voor kleine verzamelingen (<100 elementen)?
Nee, voor kleine verzamelingen is de winst van luie berekeningen vrijwel onmerkbaar en soms heeft de extra overhead een negatief effect op de prestaties.
In het project werd .lazy zonder nadenken gebruikt voor alle map/filter, zelfs op kleine collecties.
Voordelen:
Nadelen:
We hebben rapporten van een grote transactiedatabase herzien met het gebruik van .lazy alleen voor functies waar werkelijk lange ketens van transformaties waren.
Voordelen:
Nadelen: