Sök…


Tilldelningsprestanda

I Swift görs minneshantering automatiskt för dig med automatisk referensräkning. (Se Memory Management ) Allokering är processen att reservera en plats i minnet för ett objekt, och för att snabbt förstå prestandan för sådant kräver viss förståelse för högen och stacken . Högen är en minnesplats där de flesta föremål placeras, och du kanske kan tänka på den som en lagringsbod. Bunten å andra sidan är en samtalsbunt med funktioner som har lett till den aktuella exekveringen. (Följaktligen är ett stapelspår en slags utskrift av funktionerna på samtalsbunten.)

Tilldelning och omfördelning från stacken är en mycket effektiv operation, men i jämförelse är tilldelning av högar kostsamt. När du utformar för prestanda bör du tänka på detta.

Klasser:

class MyClass {

    let myProperty: String

}

Klasser i Swift är referenstyper och därför händer flera saker. Först kommer det faktiska objektet att tilldelas på högen. Sedan måste alla referenser till det objektet läggas till i bunten. Detta gör klasser till ett dyrare objekt för allokering.

structs:

struct MyStruct {

    let myProperty: Int

}

Eftersom strukturer är värdetyper och därför kopieras när de passeras, fördelas de på bunten. Detta gör strukturer mer effektiva än klasser, men om du behöver en uppfattning om identitet och / eller referenssemantik, kan en struktur inte ge dig dessa saker.

Varning om strukturer med strängar och egenskaper som är klasser

Medan strukturer i allmänhet är cheeper än klasser, bör du vara försiktig med strukturer med egenskaper som är klasser:

struct MyStruct {

    let myProperty: MyClass

}

På grund av referensräkning och andra faktorer är prestandan nu mer lik en klass. Vidare, om mer än en egenskap i strukturen är en klass, kan resultatpåverkan bli ännu mer negativ än om strukturen var en klass istället.

Även om strängar är strukturer lagrar de internt sina karaktärer på högen, så de är dyrare än de flesta strukturer.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow