Czy to tylko ja, czy Xcode 6 (6.0.1) ze Swift wydaje się być bardzo powolny podczas wpisywania kodu, zwłaszcza z autouzupełnianiem?
Normalna klasa Objective-C, nawet jeśli znajduje się w projekcie Swift, działa prawie tak samo jak poprzednio, więc to Swift ją zabija.
Czy ktoś inny doświadcza tej samej niedogodności? Czy masz pomysł, jak poprawić wydajność?
- Próbowałem grać z niektórymi ustawieniami, ale bez powodzenia.
- Oczywiście bez powodzenia próbowałem zrestartować Xcode i komputer.
- Żadne inne ciężkie aplikacje nie są otwarte.
Używam Macbooka Pro z połowy 2009 roku (2,26 GHz Intel Core 2 Duo) z 8 GB pamięci RAM i dyskiem SSD HD, co wcale nie jest nowością, ale nadal nie jest kompletnym śmieciem.
Szkoda, ponieważ byłem podekscytowany, aby zacząć używać Swift, a teraz jest to naprawdę nie do zniesienia.
Myśli / wskazówki?
Odpowiedzi:
Jest to rozwiązanie tymczasowe, ale działa bardzo dobrze.
Poniżej skryptu za pomocą aplikacji Script Editor.
Alternatywnie możesz utworzyć alias dla swojego terminala w następujący sposób:
Możesz dodać to do swojego,
~/.bash_profile
a następnie wpisaćxcodeclean
w wierszu poleceń za każdym razem, gdy chcesz wyczyścić te dwa foldery.źródło
Podczas pisania jakiegoś „prostego” kodu doświadczyłem również 100% + CPU. Kilka drobnych sztuczek, dzięki którym szybki parser będzie szybszy dzięki strukturze Twojego kodu.
Nie używaj konkatinatora „+” w łańcuchach. Dla mnie to bardzo szybko wyzwala powolność. Każde nowe „+” przenosi parser do przeszukiwania i musi ponownie przeanalizować kod za każdym razem, gdy dodajesz nowy znak gdzieś w treści funkcji.
Zamiast:
Użyj składni szablonu, która wydaje się znacznie wydajniejsza do analizowania w szybkim tempie:
W ten sposób zasadniczo nie zauważam ograniczenia w strlen z wbudowanymi zmiennymi "\ (*)".
Jeśli masz obliczenia, które używają + / * -, podziel je na mniejsze części.
Zamiast:
posługiwać się:
Może wyglądać na mniej wydajne, ale szybki parser jest w ten sposób znacznie szybszy. Niektóre formuły się nie skompilują, jeśli mają wiele operacji, nawet jeśli są matematycznie poprawne.
Jeśli masz jakieś złożone obliczenia, umieść je w func. W ten sposób parser może go przeanalizować raz i nie musi go ponownie analizować za każdym razem, gdy zmieniasz coś w treści funkcji.
Ponieważ jeśli masz obliczenia w treści swojej funkcji, to w jakiś sposób szybki parser sprawdza je za każdym razem, czy typy, składnia itp. Są nadal poprawne. Jeśli linia zmieni się powyżej obliczenia, to niektóre zmienne w obliczeniu / wzorze mogły ulec zmianie. Jeśli umieścisz go w funkcji zewnętrznej, zostanie zweryfikowany raz i szybko jest zadowolony, że będzie poprawny i nie będzie go stale analizować, co powoduje wysokie zużycie procesora.
W ten sposób uzyskałem od 100% przy każdym naciśnięciu klawisza do niskiego poziomu procesora podczas pisania. Na przykład te 3 wiersze umieszczone w treści funkcji mogą doprowadzić do indeksowania swiftparser.
ale jeśli wstawię go do funkcji func i zadzwonię później, swiftparser jest znacznie szybszy
Swift i XCode 6.1 są nadal bardzo błędne, ale jeśli zastosujesz się do tych prostych sztuczek, edycja kodu znów stanie się akceptowalna. Wolę szybki, ponieważ pozbywa się plików .h i używa znacznie czystszej składni. Wciąż jest wiele potrzebnych do rzutowania typów, takich jak "myVar as AnyObject", ale to jest mniejsze zło w porównaniu ze złożoną strukturą i składnią projektu obiektywnego c.
Inne doświadczenie, wypróbowałem SpriteKit, który jest przyjemny w użyciu, ale jest dość nieefektywny, jeśli nie potrzebujesz ciągłego malowania przy 60 klatkach na sekundę. Używanie starych CALayers jest o wiele lepsze dla procesora, jeśli twoje "duszki" nie zmieniają się tak często. Jeśli nie zmienisz zawartości .contents warstw, procesor jest w zasadzie bezczynny, ale jeśli masz aplikację SpriteKit działającą w tle, odtwarzanie wideo w innych aplikacjach może zacząć się zacinać z powodu sztywnej pętli aktualizacji 60 klatek na sekundę.
Czasami xcode wyświetla dziwne błędy podczas kompilacji, wtedy pomocne jest przejście do menu „Produkt> Wyczyść” i ponowne skompilowanie. Wydaje się, że jest to błędna implementacja pamięci podręcznej.
Kolejny świetny sposób na ulepszenie analizowania, gdy xcode utknie w kodzie, jest wspomniany w innym poście dotyczącym stackoverflow tutaj . Zasadniczo kopiujesz całą zawartość z pliku .swift do zewnętrznego edytora, a następnie kopiujesz ją z powrotem za pomocą funkcji i sprawdzasz, gdzie jest twoje wąskie gardło. To faktycznie pomogło mi przywrócić xcode do rozsądnej szybkości po tym, jak mój projekt oszalał ze 100% procesorem. kopiując swój kod z powrotem, możesz go refaktoryzować i starać się, aby ciała funkcji były krótkie, a funkcje / formuły / wyrażenia proste (lub podzielone na kilka wierszy).
źródło
Autouzupełnianie jest zepsute od czasu Xcode 4. Dopóki Apple nie zdecyduje się naprawić tego dwuletniego błędu, niestety jedynym rozwiązaniem jest wyłączenie uzupełniania kodu w preferencjach XCode (pierwsza opcja na poniższym zdjęciu).
Możesz nadal cieszyć się uzupełnianiem ręcznie, wpisując
CTRL space
lubESC
gdy jest to potrzebne.To jedyne rozwiązanie, które sprawdza się za każdym razem w 100% przypadków.
Inną rzeczą, którą niedawno odkryłem, jest: jeśli używasz wtyczek w Xcode, nie rób tego. Usuń je wszystkie. Pogłębiają problem.
źródło
Czy używasz Spotify? Zainstalowałem Yosemite GM z Xcode 6.1 GM na iMacu w połowie 2009 roku (2,66 GHz) z tym samym problemem. Odkryłem, że proces o nazwie „SpotifyWebHelper” jest zawsze oznaczony na czerwono jako nie odpowiada, więc wyłączyłem opcję „start z sieci” w spotify i teraz wydaje się, że Xcode działa znacznie lepiej.
źródło
Dowiedziałem się, że zwykle dzieje się to, gdy:
Wydaje się, że drugi przypadek został rozwiązany w jednym z najnowszych wydań xcode. Przykład: zdefiniowałem 2 niestandardowe operatory <&&> i <||> i użyłem w wyrażeniu takim jak
a <&&> b <&&> c <||> d
. Podział na wiele linii rozwiązał problem:Mam nadzieję, że Twoje przypadki są objęte jednym z dwóch powyższych ... proszę o komentarz w każdym przypadku
źródło
Miałem te same problemy nawet w Xcode 6.3
Wszystko to działo się nawet przy stosunkowo niewielkim projekcie. Wypróbowałem wszystkie poprawki, które znalazłem:
Żadne z nich nie pomogło w moim projekcie.
To, co faktycznie rozwiązało mój problem, to:
Teraz mam prawie zerowe zużycie procesora, niskie zużycie pamięci i przyzwoicie szybkie uzupełnianie.
źródło
Ogólnie rzecz biorąc, przeniesienie folderu pamięci podręcznej (DerivedData) na dysk SSD (szczególnie w moim przypadku - zewnętrzna pamięć masowa podłączona do wyjścia Thunderbolt) znacznie poprawiło wydajność mojego Xcode. Czas kompilacji i ogólne zastanawianie się nad aplikacją są około 10 razy szybsze. Przeniesiono również cały folder git na dysk SSD, co znacznie poprawiło wydajność git.
źródło
To było uciążliwe do XCode 7.2.
Apple naprawiło to w XCode 7.3 i teraz działa jak marzenie. Jest super szybki i znacznie potężniejszy, ponieważ wydaje się działać trochę jak rozmyte wyszukiwanie plików: nie musisz w rzeczywistości wpisywać dokładnego początku metody / właściwości, aby pojawiła się na liście propozycji.
źródło
Zwinięcie wszystkich metod trochę pomaga.
Command-alt-shift-left arrow wystarczy ...
Aby złożyć / rozwinąć obecne metody lub jeśli struktury używają:
Fold: komenda-alt-strzałka w lewo
Rozwiń: polecenie-alt-strzałka w prawo
źródło
SourceKitService
radzi sobie również z komentarzami w kodzie, a osadzone komentarze również go spowalniają.więc jeśli możesz sobie pozwolić na usunięcie ogromnej ilości osadzonych komentarzy, takich jak ten:
to również może pomóc.
UWAGA: w moim przypadku mój Xcode 7.3.1 (7D1014) dosłownie zablokował mi wpisywanie dowolnej litery, gdy plik miał około 700 linii komentarza z osadzonymi komentarzami. początkowo usunąłem ten blok z tego
.swift
pliku i Xcode znów ożył. Próbowałem dodać swoje komentarze część po części, usuwając osadzone komentarze, było to nadal wolniejsze niż zwykle, ale wykazywało znacznie lepszą wydajność, jeśli nie było osadzonych komentarzy.źródło
Miałem ten sam problem, w którym pisanie było opóźnione w określonej klasie i okazało się, że
/* Long multiline comments */
spowolnił pisanie.
źródło