Sobes.tech
Middle+

Jak pisać kod, aby działał szybko z punktu widzenia dynamicznego zarządzania?

sobes.tech AI

Odpowiedź od AI

Używaj struct i enum zamiast class tam, gdzie to możliwe. Typy wartości domyślnie nie korzystają z dynamicznego dispatch.

Zastosuj final do klas i metod, aby zapobiec dziedziczeniu i nadpisywaniu, umożliwiając kompilatorowi bezpośredni dispatch.

final class MyFinalClass { // Klasa nie może być dziedziczona
    final func myFinalMethod() { // Metoda nie może być nadpisana
        // ...
    }
}

Używaj protokołów z wymaganiami tylko static lub final metod/properties, lub z generykami, które mogą być specjalizowane podczas kompilacji.

protocol MyProtocol {
    static func staticMethod()
}

Używaj private i fileprivate dla metod i właściwości wewnątrz klasy/struktury/enum. To może pozwolić kompilatorowi na użycie szybszego dispatch, ponieważ zakres jest ograniczony.

class MyClass {
    private func privateMethod() {
        // ...
    }
}

Unikaj częstego używania wspólnych protokołów w czasie działania, gdy konkretne typy są z góry nieznane, ponieważ wywołania przez protokoły korzystają z tablicy wirtualnej. Preferuj generyki tam, gdzie to możliwe na etapie kompilacji.

Używaj atrybutu @inline(__always). To wskazówka dla kompilatora, aby próbował wbudować ciało funkcji w miejsce wywołania, unikając kosztów wywołania funkcji. Nie zawsze przynosi korzyści.

@inline(__always)
func myInlinedFunction() {
    // ...
}