Xcode 6 mit super langsamer Eingabe und automatischer Vervollständigung von Swift

114

Ist es nur ich oder Xcode 6 (6.0.1) mit Swift scheint sehr langsam zu sein, wenn Sie Ihren Code eingeben, insbesondere bei automatischer Vervollständigung?

Eine normale Objective-C-Klasse funktioniert, selbst wenn sie sich in einem Swift-Projekt befindet, fast genauso wie zuvor. Es ist also Swift, der sie beendet.

Hat jemand die gleichen Unannehmlichkeiten? Haben Sie eine Idee, wie Sie die Leistung verbessern können?

  • Ich habe versucht, mit einigen Einstellungen zu spielen, aber kein Glück.
  • Ich habe natürlich auch versucht, Xcode und den Computer ohne Glück neu zu starten.
  • Es sind keine anderen schweren Apps geöffnet.

Ich verwende ein Mid 2009 Macbook Pro (2,26 GHz Intel Core 2 Duo) mit 8 GB RAM und SSD HD, was überhaupt nicht das Neueste ist, aber immer noch kein kompletter Müll.

Es ist eine Schande, dass ich aufgeregt war, Swift zu verwenden, und es jetzt wirklich unerträglich ist.

Gedanken / Tipps?

mllm
quelle
1
Ich habe die gleichen Probleme wie Sie. Oft sagt mir Xcode "SourceKit beendet, Editor vorübergehend eingeschränkt"
idmean
Ja, das ist auch ein anderes Problem, ich bin mir aber nicht sicher, ob sie verwandt sind. Es war langsam, selbst wenn dieser Fehler auftritt.
Mllm
1
Ich bin sicher, dass sie verwandt sind. In Beta 5 habe ich diese Nachricht noch öfter gesehen, und das immer dann, wenn der Vorschlag nicht funktionierte. (Als ich einige Zeichen tippte und Esc drückte, um den Vorschlag auszulösen)
idmean
1
Ich habe das gleiche Problem. Mein XCode verbraucht mehr als 300% der CPU und verlangsamt die Netzhaut meines MacBook auf Schneckengeschwindigkeit. Ich tippe heutzutage ziemlich blind und warte, bis der xcode fertig ist.
pkuhar
1
Die gleichen Probleme mit einem 15,6-Zoll-MacBook Pro von Ende 2011 mit 8 GB RAM und einer SSD. 90% der Zeitcode-Vervollständigung friert Xcode ein, wenn ich den Aktivitätsmonitor überprüfe, sehe ich ~ 200% CPU-Auslastung. Friert nach einigen Sekunden ein zu ein paar Minuten.
Isair

Antworten:

86
  • Beenden Sie Xcode und starten Sie den Mac neu. Dies ist nicht erforderlich, wird jedoch bevorzugt.
  • Löschen Sie den Inhalt des Ordners ~ / Library / Developer / Xcode / DerivedData
  • Löschen Sie den Inhalt ~ / Library / Caches / com.apple.dt.Xcode

Dies ist eine zeitliche Lösung, funktioniert aber sehr gut.

Unterhalb des Skripts mit der Skripteditor-App.

tell application "Terminal"
    do script "rm -frd ~/Library/Developer/Xcode/DerivedData/*"
    do script "rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"
end tell

Alternativ können Sie einen Alias ​​für Ihr Terminal wie folgt erstellen:

alias xcodeclean="rm -frd ~/Library/Developer/Xcode/DerivedData/* && rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"

Sie können dies zu Ihrem hinzufügen ~/.bash_profileund dann xcodecleanjedes Mal in die Befehlszeile eingeben, wenn Sie diese beiden Ordner löschen möchten.

g8production - Daniele Gali8
quelle
Nun, obwohl es nicht annähernd perfekt ist, sieht es so aus, als würde Ihre Lösung es erheblich verbessern. Ich werde markieren, ist so lösend, wie nach ziemlich langer Zeit ist dies wahrscheinlich das Beste, was es bekommen kann. Würde mich freuen über andere zu hören ... Vielen Dank!
Mllm
Mein Laptop brauchte fast eine Minute, um den gesamten Inhalt aus diesen beiden Ordnern zu entfernen. Die Indizierung auf Xcode dauert jetzt weniger als 30 Sekunden.
Eneko Alonso
Es hat meine Eingabe und automatische Vervollständigung nicht beschleunigt, aber es hat mir geholfen, ziemlich viel Speicherplatz von meinem Mac freizugeben.
Scott Zhu
Diese Antwort half bei der automatischen Vervollständigung, stackoverflow.com/a/29849869/1213267
Scott Zhu
13

Ich habe auch 100% + CPU erlebt, als ich einen "einfachen" Code eingegeben habe. Einige kleine Tricks, um den Swift-Parser durch die Strukturierung Ihres Codes zu beschleunigen.

Verwenden Sie den Concatinator "+" nicht in Zeichenfolgen. Für mich löst dies die Langsamkeit sehr schnell aus. Jedes neue "+" bringt den Parser zum Crawlen und muss den Code jedes Mal neu analysieren, wenn Sie irgendwo in Ihrem Funktionskörper ein neues Zeichen hinzufügen.

Anstatt:

var str = "This" + String(myArray.count) + " is " + String(someVar)

Verwenden Sie die Template-Syntax, die viel schneller zu analysieren scheint:

var str = "This \(myArray.count) is \(someVar)"

Auf diese Weise bemerke ich grundsätzlich keine Begrenzung in strlen mit Inline-Vars "\ (*)".

Wenn Sie Berechnungen haben, die + / * verwenden, teilen Sie diese in kleinere Teile auf.

Anstatt:

var result = pi * 2 * radius 

verwenden:

var result  = pi * 2
    result *= radius

Es mag weniger effizient aussehen, aber der schnelle Parser ist auf diese Weise viel schneller. Einige Formeln werden nicht kompiliert, wenn sie zu viele Operationen haben, selbst wenn sie mathematisch korrekt sind.

Wenn Sie einige komplexe Berechnungen haben, geben Sie diese in eine Funktion ein. Auf diese Weise kann der Parser es einmal analysieren und muss es nicht jedes Mal neu analysieren, wenn Sie etwas in Ihrem Funktionskörper ändern.

Denn wenn Sie eine Berechnung in Ihrem Funktionskörper haben, überprüft der schnelle Parser diese jedes Mal, ob die Typen, die Syntax usw. noch korrekt sind. Wenn sich eine Linie über der Berechnung ändert, haben sich möglicherweise einige Variablen in Ihrer Berechnung / Formel geändert. Wenn Sie es in eine externe Funktion einfügen, wird es einmal validiert und swift ist froh, dass es korrekt ist und es nicht ständig repariert, was die hohe CPU-Auslastung verursacht.

Auf diese Weise kam ich beim Tippen von 100% bei jedem Tastendruck auf niedrige CPU. Zum Beispiel können diese 3 Zeilen, die in Ihren Funktionskörper eingefügt werden, den Swiftparser zum Crawlen bringen.

let fullPath =  "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"
let spacesData  = NSDictionary(contentsOfFile: fullPath )! // as Dictionary<String, AnyObject>
let spaces : AnyObject   = spacesData["SpacesDisplayConfiguration"]!["Management Data"]!!["Monitors"]!![0]["Spaces"]!! 

println ( spaces )

aber wenn ich es in eine func stecke und es später aufrufe, ist swiftparser viel schneller

// some crazy typecasting here to silence the parser
// Autodetect of Type from Plist is very rudimentary, 
// so you have to teach swift your types
// i hope this will get improved in swift in future
// would be much easier if one had a xpath filter with
// spacesData.getxpath( "SpacesDisplayConfiguration/Management Data/Monitors/0/Spaces" ) as Array<*> 
// and xcode could detect type from the plist automatically
// maybe somebody can show me a more efficient way to do it
// again to make it nice for the swift parser, many vars and small statements
func getSpacesDataFromPlist() -> Array<Dictionary<String, AnyObject>> {
  let fullPath =  "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"

  let spacesData  = NSDictionary(contentsOfFile: fullPath )!    as Dictionary<String, AnyObject>
  let sdconfig    = spacesData["SpacesDisplayConfiguration"]    as Dictionary<String, AnyObject>
  let mandata     = sdconfig["Management Data"]                 as Dictionary<String, AnyObject> 
  let monitors    = mandata["Monitors"]                         as Array<Dictionary<String, AnyObject>> 
  let monitor     = monitors[0]                                 as Dictionary<String, AnyObject>
  let spaces      = monitor["Spaces"]                           as Array<Dictionary<String, AnyObject>>

  return spaces
}

func awakeFromNib() {
  ....
  ... typing here ...

  let spaces = self.getSpacesDataFromPlist()
  println( spaces) 
}

Swift und XCode 6.1 sind immer noch sehr fehlerhaft, aber wenn Sie diese einfachen Tricks befolgen, wird das Bearbeiten von Code wieder akzeptabel. Ich bevorzuge schnell viel, da es .h-Dateien entfernt und viel sauberere Syntax verwendet. Es werden immer noch viele Typumwandlungen wie "myVar as AnyObject" benötigt, aber das ist das kleinere Übel im Vergleich zur komplexen Ziel-C-Projektstruktur und -Syntax.

Auch eine andere Erfahrung, ich habe das SpriteKit ausprobiert, das Spaß macht, aber es ist ziemlich ineffizient, wenn Sie kein ständiges Repaint mit 60 fps benötigen. Die Verwendung alter CALayer ist für die CPU viel besser, wenn sich Ihre "Sprites" nicht so oft ändern. Wenn Sie den Inhalt der Ebenen nicht ändern, ist die CPU im Grunde genommen inaktiv. Wenn jedoch eine SpriteKit-App im Hintergrund ausgeführt wird, kann es vorkommen, dass die Videowiedergabe in anderen Apps aufgrund der unbegrenzten 60-fps-Aktualisierungsschleife stottert.

Manchmal zeigt xcode beim Kompilieren seltsame Fehler an, dann hilft es, in das Menü "Produkt> Reinigen" zu gehen und es erneut zu kompilieren. Dies scheint eine fehlerhafte Implementierung des Caches zu sein.

Eine weitere großartige Möglichkeit, das Parsen zu verbessern, wenn xcode mit Ihrem Code hängen bleibt, wird in einem anderen Stackoverflow-Beitrag hier erwähnt . Grundsätzlich kopieren Sie alle Inhalte aus Ihrer .swift-Datei in einen externen Editor und kopieren sie dann Funktion für Funktion zurück, um festzustellen, wo sich Ihr Engpass befindet. Dies hat mir tatsächlich geholfen, xcode wieder auf eine vernünftige Geschwindigkeit zu bringen, nachdem mein Projekt mit 100% CPU verrückt geworden war. Während Sie Ihren Code zurückkopieren, können Sie ihn umgestalten und versuchen, Ihre Funktionskörper kurz und Funktionen / Formulare / Ausdrücke einfach zu halten (oder in mehrere Zeilen aufzuteilen).

Daniel Unterberger
quelle
Sehr gründliche Antwort. Vielleicht sind einige der Vorschläge als "Erste Hilfe" großartig, aber erwarten wir nicht, dass Xcode einfach funktioniert, ohne große Probleme zu haben?
Mllm
1
Leider ist xcode 6.1 + swift ziemlich instabil, so dass diese "Hacks" benötigt werden. Apple sollte Swift und Xcode reparieren. Aber schnell zu programmieren ist sehr schön, so dass dies kurzfristig die einzige Möglichkeit ist, die CPU-Auslastung in Schach zu halten.
Daniel Unterberger
Ich habe alle möglichen Änderungen vorgenommen, die Sie vorschlagen, aber leider ist meine automatische Vervollständigung immer noch schlecht. Ich bezweifle, dass Kurzform, wenn Klauseln auch Probleme verursachen könnten. Kann jemand das anerkennen? Ich meine zurück (a == b)? x: y
Ilker Baltaci
Nun, Code auf eine bestimmte Weise zu schreiben, um IDE glücklich zu machen, ist ein echter Unsinn
Andrey Gordeev
10

Automatische Vervollständigung da Xcode gebrochen 4. Bis Apple diese 2 Jahre alt Fehler zu beheben entscheidet, ist die einzige Lösung, leider ist der Code - Vervollständigung drehen OFF auf XCode-Einstellungen (erste Möglichkeit , das Bild unten).

Sie können die Fertigstellung weiterhin manuell durch Eingabe CTRL spaceoder ESCbei Bedarf genießen .

Dies ist die einzige Lösung, die jedes Mal in 100% der Fälle funktioniert.

Geben Sie hier die Bildbeschreibung ein

Eine andere Sache, die ich kürzlich entdeckt habe, ist: Wenn Sie Plugins für Xcode verwenden, tun Sie dies nicht. Entfernen Sie sie alle. Sie verschlimmern das Problem.

Ente
quelle
5

Verwenden Sie Spotify? Ich habe Yosemite GM mit Xcode 6.1 GM auf einem iMac Mitte 2009 (2,66 GHz) mit dem gleichen Problem installiert. Ich habe festgestellt, dass ein Prozess namens "SpotifyWebHelper" immer rot markiert ist und nicht reagiert. Daher habe ich die Option "Start from Web" in deaktiviert spotify und jetzt scheint Xcode deutlich besser zu laufen.

Eugenio Baglieri
quelle
Interessant, aber für mich hat es nichts mit Spotify zu tun ... Es zeigt jedoch vielleicht, dass es sich nur um ein "normales" Leistungsproblem handelt - was bedeutet, dass mehr Ressourcen gelöscht werden und es besser funktioniert. Das ist traurig, da ich keine Ressourcen mehr zur Verfügung habe (abgesehen von Geld auf einem neuen Mac).
Mllm
2

Ich habe herausgefunden, dass das normalerweise passiert, wenn Sie:

  • lange Ausdrücke in einer einzigen Aussage haben (siehe diese Antwort )
  • Mischen Sie mehrere benutzerdefinierte Operatoren in einem einzigen Ausdruck

Der zweite Fall scheint in einer der neuesten xcode-Versionen behoben zu sein. Beispiel: Ich habe 2 benutzerdefinierte Operatoren <&&> und <||> definiert und in einem Ausdruck wie verwendet a <&&> b <&&> c <||> d. Das Aufteilen in mehrere Zeilen löste das Problem:

let r1 = a <&&> b
let r2 = r1 <&&> c
let r3 = r2 <||> d

Ich hoffe, dass Ihre Fälle von einer der beiden oben genannten abgedeckt werden ... Bitte geben Sie in beiden Fällen einen Kommentar ab

Antonio
quelle
5
Leider passiert es auch in einem brandneuen, sauberen Projekt, in dem nichts enthalten ist und in dem etwas so Einfaches wie "var s: Stri ..." eingegeben wird. Sobald ich anfange, St ... einzugeben, wird es träge, wenn ich nach Abschlussvorschlägen suche.
Mllm
Es sind definitiv die Operanden für mich. Wenn mehr als ein Operand in derselben Zeile vorhanden ist, wird dies verursacht. Danke für die Antwort. Dies sollte die richtige Antwort sein
Kesava
2

Ich hatte die gleichen Probleme sogar in Xcode 6.3

  • super langsame Autovervollständigungen
  • super langsame Indizierung
  • enorme CPU-Auslastung durch Swift und SourceKitService
  • enorme Speichernutzung durch SourceKitService

All dies geschah bereits in relativ kleinen Projekten. Ich habe alle Korrekturen ausprobiert, die ich finden konnte:

  • Löschen von ~ / Library / Developer / Xcode / DerivedData / *
  • Löschen von ~ / Library / Caches / com.apple.dt.Xcode / *
  • Entfernen Sie alle "+" Zeichenfolgen, die kombiniert werden, aus dem Code
  • Alle verdächtigen Wörterbuchdeklarationen wurden entfernt

Nichts davon hat in meinem Projekt wirklich geholfen.

Was mein Problem tatsächlich gelöst hat, war:

  • Platzieren Sie jedes Ende jeder Klasse in einer eigenen Datei
  • Platzieren jeder einzelnen Erweiterung in einer eigenen Datei (Class + ExtName.swift)
  • Platzieren von "Swift-Methoden außerhalb der Klasse" in einer eigenen Datei

Jetzt habe ich eine CPU-Auslastung von nahezu Null, eine geringe Speichernutzung und anständig schnelle Abschlüsse.

Matej Ukmar
quelle
2

Im Allgemeinen hat das Verschieben des Cache-Ordners (DerivedData) auf ein SSD-Laufwerk (insbesondere in meinem Fall - ein mit dem Thunderbolt-Exit verbundener äußerer Speicher) meine Xcode-Leistung erheblich verbessert. Die Kompilierungszeit und allgemeine Fragen rund um die App sind etwa zehnmal schneller. Außerdem wurde der gesamte Git-Ordner auf die SSD verschoben, wodurch die Git-Leistung erheblich verbessert wurde.

brkeyal
quelle
Eigentlich hatte ich im ursprünglichen Problem meinen Mac bereits mit SSD-Laufwerk aktualisiert und alles lief davon inkl. das Betriebssystem, und immer noch gab es Probleme
mllm
2

Es war ein Schmerz bis XCode 7.2.

Apple hat es in XCode 7.3 behoben und jetzt funktioniert es wie ein Zauber. Es ist superschnell und viel leistungsfähiger, da es ein bisschen wie die unscharfe Suche nach Dateien zu funktionieren scheint: Sie müssen nicht den genauen Anfang der Methode / Eigenschaft eingeben, damit sie in der Liste der Sätze erscheint.

Bioche
quelle
2

Das Reduzieren aller Methoden hilft ein wenig.

Befehl-Alt-Umschalt-Links-Pfeil macht den Trick ...

Um aktuelle Methoden zu falten / zu entfalten oder wenn Strukturen verwenden:

Falten: Befehl-Alt-Links-Pfeil

Entfalten: Befehl-Alt-Rechts-Pfeil

Rowdyruckus
quelle
1

SourceKitServiceEs ist auch etwas umständlich, mit Kommentaren im Code umzugehen, und die eingebetteten Kommentare verlangsamen ihn ebenfalls.

Wenn Sie es sich also leisten können, den massiven Klumpen eingebetteter Kommentare wie folgt zu entfernen:

/*
 * comment 
    /*
     * embedded comment
     */
 */

das kann definitiv auch helfen.


HINWEIS: In meinem Fall wurde mein Xcode 7.3.1 (7D1014) buchstäblich daran gehindert, einen Buchstaben einzugeben, wenn die Datei etwa 700 Kommentarzeilen mit eingebetteten Kommentaren enthielt. Anfangs habe ich diesen Block aus dieser .swiftDatei entfernt und Xcode ist wieder lebendig geworden. Ich habe versucht, meine Kommentare Teil für Teil wieder hinzuzufügen, indem ich eingebettete Kommentare entfernt habe. Es war immer noch langsamer als gewöhnlich, aber es zeigte eine deutlich bessere Leistung, wenn es keine eingebetteten Kommentare gab.

holex
quelle
1

Ich hatte das gleiche Problem, bei dem das Tippen in einer bestimmten Klasse zurückblieb, und das stellte sich heraus

/* Long multiline comments */

verlangsamte das Tippen.

Aziz Akgul
quelle