2014-07-05 8 views
6

Czytam samouczek dotyczący Swift (http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start) i wstępnie skonfigurowany, aby nie ustawiać typu jawnie, ponieważ jest bardziej czytelny w ten sposób.Swift Explicit vs. Inferred Wpisanie: Wydajność

Naprawdę nie zgadzam się z tym punktem, ale to nie jest pytanie. Moje pytanie brzmi: czy jest bardziej wydajne pod względem wydajności (kompilator ...), aby wyraźnie ustawić typ?

Na przykład, byłoby to: var hello: Int = 56 być bardziej skuteczne niż to: var tutorialTeam = 56

+2

Po sprawdzeniu kompilatora nie wpłynie to w żaden sposób na wydajność aplikacji. 'let a = 1' i' let a: Int = 1' są całkowicie równoważne. Jeśli sprawdzasz 'a' przy użyciu alt + kliknięcie, powie to, że jest to typ' Int'. – Jack

+0

Czy kompilator nie sprawdzi żadnego typu dla 1, zanim ustawi go jako Int? – user2462805

+3

Um? Być może nie całkiem rozumiesz punkt inferencji typu statycznego. Kiedy zostawisz adnotację, nie znaczy to, że kompilator traktuje zmienną tylko jakąś ogólną wartość rejestru, którą musi obejść. Najpierw następuje wnioskowanie typów, zmienna jest następnie traktowana tak, jakby była tym typem we wszystkich wyrażeniach, w których jest używana. Jeśli z jakiegoś powodu kompilator nie może wydedukować typu zmiennej, staje się błędem typu. Nic nie występuje w środowisku wykonawczym. Nie można uzyskać żadnego przyrostu wydajności. – CodaFi

Odpowiedz

13

Jest żadnej różnicy w wydajności pomiędzy kodu, który używa jawnych typów i kod, który używa typu wnioskowanie. Skompilowane dane wyjściowe są identyczne w każdym przypadku.

Po pominięciu typu kompilator po prostu je podaje.

Bardzo małe różnice zaobserwowane w accepted answer są zwykłymi artefaktami mikroprocesorowymi i nie można im ufać!

To, czy podasz wyraźny typ, czy nie, jest kwestią gustu. W niektórych kontekstach może to uczynić Twój kod bardziej czytelnym.

Jedyny moment, w którym zmienia kod, to określenie innego typu niż ten, który kompilator wywnioskuje. Jako przykład:

var num = 2 

Powyższy kod wnioskuje, że num jest Int, ze względu na to być zainicjowane z całkowitą dosłownym. Jednak można „siła”, że jest to Double następująco:

var num: Double = 2 
+0

To jest poprawna odpowiedź. Kompilacja jest taka sama, więc dosłownie niemożliwe jest, aby typy jawne lub niejawne miały jakikolwiek wpływ na wydajność. –

+0

@PaulManta - dziękuję, denerwowało mnie, że akceptowana odpowiedź jest rażąco błędna! – ColinE

+0

Dobry pomysł, aby sprawdzić skompilowane wyjście. –

0

Rodzaj wnioskowanie nie wpłynie na wydajność w swojej podanym przykładzie. Jednakże zauważyłem, że specyfika typowania w tablicy Swift znacząco wpływa na wydajność.

Na przykład poniższa metoda tasuje tablicę typu Any.

class func shuffleAny(inout array: [Any]) { 
    for (var i = 0; i < array.count; i++) { 
     let currentObject: Any = array[i] 
     let randomIndex = Int(arc4random()) % array.count 
     let randomObject: Any = array[randomIndex] 

     array[i] = randomObject; 
     array[randomIndex] = currentObject 
    } 
} 

Powyższą czynność jest znacznie mniejsza niż w przypadku, ja, aby ta funkcja ma tablicę Int zamiast jak to

class func shuffleIntObjects(inout array: [Int]) { 
    for (var i = 0; i < array.count; i++) { 
     let currentObject: Int = array[i] 
     let randomIndex = Int(arc4random()) % array.count 
     let randomObject: Int = array[randomIndex] 

     array[i] = randomObject; 
     array[randomIndex] = currentObject 
    } 
} 

funkcji, która wykorzystuje [Any] taktowany w co 0,537 s 3% odchylenia standardowego za 1 milion obiektów: Int. I funkcja, która używa [Int] taktowania w 0,181 sekundy 2% STDEV dla 1 miliona obiektów Int.

Możesz sprawdzić to powtórzenie (https://github.com/vsco/swift-benchmarks), które zawiera o wiele bardziej interesujące benchmarki w Swift. Jednym z moich ulubionych jest to, że generatory Swift działają bardzo słabo w wyżej wymienionych warunkach testowych.

2

Z mojego doświadczenia wynika, że ​​w przypadku kompilacji przy użyciu typów jawnych i wywnioskowanych wystąpił ogromny wpływ na wydajność. Większość mojego powolnego kodu kompilacyjnego została rozwiązana przez jawne wpisanie zmiennych.

Wygląda na to, że kompilator Swift wciąż ma pole do poprawy w tym obszarze. Spróbuj porównać niektóre projekty, a zobaczysz dużą różnicę.

Oto artykuł napisany na how to speed up slow Swift compile times i jak dowiedzieć się, co jest przyczyną.