Używam Xcode 6 Beta 6.
To jest coś, co mnie denerwuje od jakiegoś czasu, ale osiąga punkt, w którym jest ledwo użyteczny.
Mój projekt zaczyna mieć przyzwoity rozmiar 65 plików Swift i kilka zmostkowanych plików Objective-C (które tak naprawdę nie są przyczyną problemu).
Wygląda na to, że jakakolwiek niewielka modyfikacja dowolnego pliku Swift (np. Dodanie prostej białej spacji w klasie, która prawie nie jest używana w aplikacji) spowoduje rekompilację całego pliku Swift dla określonego celu.
Po głębszym dochodzeniu odkryłem, że prawie 100% czasu kompilatora zajmuje CompileSwift
faza, w której Xcode uruchamia swiftc
polecenie na wszystkich plikach Swift twojego celu.
Przeprowadziłem dalsze dochodzenie i jeśli utrzymam delegację aplikacji z domyślnym kontrolerem, kompilacja będzie bardzo szybka, ale ponieważ dodawałem coraz więcej plików projektu, czas kompilacji zaczynał się naprawdę spowalniać.
Teraz, mając tylko 65 plików źródłowych, kompilacja za każdym razem zajmuje około 8/10 sekund. Wcale niezbyt szybki .
Nie widziałem żadnego postu na ten temat, z wyjątkiem tego , ale była to stara wersja Xcode 6. Zastanawiam się, czy w tym przypadku jestem jedyny.
AKTUALIZACJA
Sprawdziłem kilka projektów Swift na GitHub, takich jak Alamofire , Euler i CryptoSwift , ale żaden z nich nie miał wystarczającej liczby plików Swift do porównania. Jedynym projektem, który znalazłem, który zaczynał mieć przyzwoity rozmiar, był SwiftHN i mimo że miał tylko tuzin plików źródłowych, nadal byłem w stanie zweryfikować to samo, jedną prostą przestrzeń i cały projekt wymagał ponownej kompilacji, która zaczynała zajmować mało czasu (2/3 sekundy).
W porównaniu z kodem Objective-C, w którym zarówno analizator, jak i kompilacja płoną szybko, to naprawdę wydaje się, że Swift nigdy nie będzie w stanie obsłużyć dużych projektów, ale powiedz mi, że się mylę.
AKTUALIZACJA Z Xcode 6 Beta 7
Nadal nie ma żadnej poprawy. To zaczyna być śmieszne. Z braku #import
Swift naprawdę nie rozumiem, jak Apple kiedykolwiek będzie w stanie to zoptymalizować.
AKTUALIZACJA Z Xcode 6.3 i Swift 1.2
Apple dodał przyrostowe kompilacje (i wiele innych optymalizacji kompilatora). Musisz migrować swój kod do Swift 1.2, aby zobaczyć te korzyści, ale Apple dodało narzędzie w Xcode 6.3, aby Ci to pomóc:
JEDNAK
Nie radujcie się tak szybko jak ja. Solver graficzny, którego używają do tworzenia kompilacji przyrostowej, nie jest jeszcze zbyt dobrze zoptymalizowany.
Rzeczywiście po pierwsze, nie sprawdza zmian sygnatur funkcji, więc jeśli dodasz spację w bloku jednej metody, wszystkie pliki zależne od tej klasy zostaną ponownie skompilowane.
Po drugie, wydaje się, że tworzy drzewo na podstawie plików, które zostały ponownie skompilowane, nawet jeśli zmiana ich nie dotyczy. Na przykład, jeśli przeniesiesz te trzy klasy do różnych plików
class FileA: NSObject {
var foo:String?
}
class FileB: NSObject {
var bar:FileA?
}
class FileC: NSObject {
var baz:FileB?
}
Teraz, jeśli zmodyfikujesz FileA
, kompilator oczywiście zaznaczy, FileA
że zostanie ponownie skompilowany. Spowoduje to również ponowną kompilację FileB
(to byłoby OK w oparciu o zmiany w FileA
), ale również FileC
dlatego, że FileB
została ponownie skompilowana, i to jest dość złe, ponieważ FileC
nigdy nie używa FileA
tutaj.
Mam więc nadzieję, że poprawią ten solver drzewa zależności ... Otworzyłem radar z tym przykładowym kodem.
AKTUALIZACJA Z Xcode 7 beta 5 i Swift 2.0
Wczoraj firma Apple wydała wersję beta 5, a w informacjach o wersji mogliśmy zobaczyć:
Swift Language & Compiler • Przyrostowe kompilacje: zmiana samej treści funkcji nie powinna już powodować przebudowywania zależnych plików. (15352929)
Spróbowałem i muszę powiedzieć, że teraz działa naprawdę (naprawdę!) Dobrze. Szybko zoptymalizowali przyrostowe kompilacje.
Gorąco polecam utworzenie swift2.0
gałęzi i aktualizowanie kodu za pomocą XCode 7 beta 5. Będziesz zadowolony z ulepszeń kompilatora (powiedziałbym jednak, że globalny stan XCode 7 jest wciąż powolny i błędny)
AKTUALIZACJA Z Xcode 8.2
Minęło trochę czasu od mojej ostatniej aktualizacji na ten temat, więc oto jest.
Nasza aplikacja ma teraz około 20 000 wierszy prawie wyłącznie kodu Swift, który jest przyzwoity, ale nie wyróżnia się. Przeszedł szybką migrację 2, a następnie szybką 3. Kompilacja na MacBooku Pro z połowy 2014 r. (Intel Core i7 2,5 GHz) trwa około 5/6 m, co jest dobre w przypadku czystej wersji.
Jednak przyrostowa kompilacja jest wciąż żartem, mimo że Apple twierdzi, że:
Xcode nie odbuduje całego obiektu docelowego, jeśli wystąpiły tylko niewielkie zmiany. (28892475)
Oczywiście myślę, że wielu z nas śmiało się po sprawdzeniu tego bzdury (dodanie jednej prywatnej (prywatnej!) Właściwości do dowolnego pliku mojego projektu spowoduje rekompilację całej rzeczy ...)
Chciałbym wskazać wam ten wątek na forach programistów Apple, który zawiera więcej informacji na temat problemu (a także docenia komunikację programistów Apple na ten temat od czasu do czasu)
Zasadniczo ludzie wymyślili kilka rzeczy, aby spróbować ulepszyć przyrostową kompilację:
- Dodaj
HEADER_MAP_USES_VFS
ustawienie projektu ustawione natrue
- Wyłącz
Find implicit dependencies
ze swojego programu - Utwórz nowy projekt i przenieś hierarchię plików do nowego.
Spróbuję rozwiązania 3, ale rozwiązanie 1/2 nie działało dla nas.
Jak na ironię zabawne w tej całej sytuacji jest to, że patrząc na pierwszy post w tej kwestii używaliśmy Xcode 6 z moim kodem swift 1 lub swift 1.1, kiedy osiągnęliśmy powolność pierwszych kompilacji, a teraz około dwa lata później, pomimo faktycznych ulepszeń od Apple sytuacja jest tak samo zła, jak w przypadku Xcode 6. Jak na ironię.
Naprawdę NAPRAWDĘ żałuję, że wybrałem Swift zamiast Obj / C do naszego projektu z powodu codziennej frustracji. (Nawet przełączam się na AppCode, ale to już inna historia)
W każdym razie widzę, że ten post SO ma ponad 32 000 wyświetleń i 143 wzloty w chwili pisania tego tekstu, więc chyba nie jestem jedyny. Trzymajcie się chłopaki, pomimo pesymizmu w tej sytuacji, może być trochę światła na końcu tunelu.
Jeśli masz czas (i odwagę!), Myślę, że Apple z zadowoleniem przyjmuje radar w tej sprawie.
Do następnego razu! Twoje zdrowie
AKTUALIZACJA Z Xcode 9
Natknąć się na to dzisiaj. Xcode po cichu wprowadził nowy system kompilacji w celu poprawy obecnej okropnej wydajności. Musisz włączyć to w ustawieniach obszaru roboczego.
Próbowałem jeszcze, ale zaktualizuje ten post po zakończeniu. Wygląda obiecująco.