Ich benutze Xcode 6 Beta 6.
Das nervt mich schon seit einiger Zeit, aber es erreicht einen Punkt, an dem es jetzt kaum noch verwendbar ist.
Mein Projekt hat eine anständige Größe von 65 Swift-Dateien und ein paar überbrückte Objective-C-Dateien (die wirklich nicht die Ursache des Problems sind).
Es scheint, als würde eine geringfügige Änderung an einer Swift-Datei (wie das Hinzufügen eines einfachen Leerraums in einer Klasse, die in der App kaum verwendet wird) dazu führen, dass die gesamten Swift-Dateien für das angegebene Ziel neu kompiliert werden.
Nach einer eingehenderen Untersuchung habe ich festgestellt, dass die CompileSwift
Phase, in der Xcode den swiftc
Befehl für alle Swift-Dateien Ihres Ziels ausführt , fast 100% der Compilerzeit in Anspruch nimmt .
Ich habe einige weitere Untersuchungen durchgeführt, und wenn ich den App-Delegaten nur mit einem Standard-Controller belasse, ist die Kompilierung sehr schnell, aber da ich immer mehr meiner Projektdateien hinzufügte, wurde die Kompilierungszeit langsam.
Mit nur 65 Quelldateien dauert das Kompilieren jedes Mal etwa 8/10 Sekunden. Überhaupt nicht sehr schnell .
Ich habe keinen Beitrag gesehen, der über dieses Problem spricht, außer diesem , aber es war eine alte Version von Xcode 6. Ich frage mich also, ob ich in diesem Fall der einzige bin.
AKTUALISIEREN
Ich habe einige Swift-Projekte auf GitHub wie Alamofire , Euler und CryptoSwift überprüft , aber keines von ihnen hatte genug Swift-Dateien, um sie tatsächlich zu vergleichen. Das einzige Projekt, bei dem ich feststellte, dass es eine anständige Größe hatte, war SwiftHN , und obwohl es nur ein Dutzend Quelldateien hatte, konnte ich immer noch das Gleiche überprüfen, einen einfachen Speicherplatz und das gesamte Projekt musste neu kompiliert werden wenig Zeit (2/3 Sekunden).
Im Vergleich zu Objective-C-Code, bei dem sowohl der Analysator als auch die Kompilierung blitzschnell sind, scheint Swift wirklich nie in der Lage zu sein, große Projekte zu bearbeiten, aber bitte sagen Sie mir, dass ich falsch liege.
UPDATE Mit Xcode 6 Beta 7
Immer noch keine Verbesserung. Das wird langsam lächerlich. Aufgrund des Mangels #import
an Swift sehe ich wirklich nicht, wie Apple dies jemals optimieren kann.
UPDATE Mit Xcode 6.3 und Swift 1.2
Apple hat inkrementelle Builds (und viele andere Compiler-Optimierungen) hinzugefügt . Sie müssen Ihren Code auf Swift 1.2 migrieren, um diese Vorteile zu sehen. Apple hat jedoch in Xcode 6.3 ein Tool hinzugefügt, das Ihnen dabei hilft:
JEDOCH
Freue dich nicht zu schnell wie ich. Der Graph-Solver, mit dem der Build inkrementell gemacht wird, ist noch nicht sehr gut optimiert.
In der Tat werden zunächst keine Änderungen der Funktionssignaturen betrachtet. Wenn Sie also ein Leerzeichen im Block einer Methode hinzufügen, werden alle Dateien, die von dieser Klasse abhängen, neu kompiliert.
Zweitens scheint es, den Baum basierend auf den Dateien zu erstellen, die neu kompiliert wurden, auch wenn eine Änderung sie nicht beeinflusst. Wenn Sie diese drei Klassen beispielsweise in verschiedene Dateien verschieben
class FileA: NSObject {
var foo:String?
}
class FileB: NSObject {
var bar:FileA?
}
class FileC: NSObject {
var baz:FileB?
}
Wenn Sie nun Änderungen vornehmen FileA
, markiert der Compiler offensichtlich FileA
die Neukompilierung. Es wird auch neu kompiliert FileB
(das wäre aufgrund der Änderungen an in Ordnung FileA
), aber auch, FileC
weil FileB
es neu kompiliert wird, und das ist ziemlich schlecht, weil es hier FileC
nie verwendet wird FileA
.
Ich hoffe also, dass sie diesen Abhängigkeitsbaumlöser verbessern ... Ich habe mit diesem Beispielcode ein Radar geöffnet .
UPDATE Mit Xcode 7 Beta 5 und Swift 2.0
Gestern hat Apple die Beta 5 veröffentlicht und in den Versionshinweisen konnten wir sehen:
Swift Language & Compiler • Inkrementelle Builds: Wenn Sie nur den Hauptteil einer Funktion ändern, sollten abhängige Dateien nicht mehr neu erstellt werden. (15352929)
Ich habe es versucht und ich muss sagen, dass es jetzt wirklich (wirklich!) Gut funktioniert. Sie haben die inkrementellen Builds schnell optimiert.
Ich empfehle Ihnen dringend, einen swift2.0
Zweig zu erstellen und Ihren Code mit XCode 7 Beta 5 auf dem neuesten Stand zu halten. Sie werden von den Verbesserungen des Compilers begeistert sein (ich würde jedoch sagen, dass der globale Status von XCode 7 immer noch langsam und fehlerhaft ist).
UPDATE mit Xcode 8.2
Es ist eine Weile her seit meinem letzten Update zu diesem Thema, also hier ist es.
Unsere App besteht jetzt aus etwa 20.000 Zeilen fast ausschließlich Swift-Code, was anständig, aber nicht herausragend ist. Es wurde schnell 2 und dann schnell 3 migriert. Das Kompilieren auf einem Macbook Pro Mitte 2014 (2,5 GHz Intel Core i7) dauert ca. 5 / 6m, was bei einem sauberen Build in Ordnung ist.
Der inkrementelle Build ist jedoch immer noch ein Witz, obwohl Apple behauptet:
Xcode erstellt nicht das gesamte Ziel neu, wenn nur kleine Änderungen vorgenommen wurden. (28892475)
Offensichtlich denke ich, dass viele von uns nur gelacht haben, nachdem sie diesen Unsinn überprüft haben (das Hinzufügen einer privaten (privaten!) Eigenschaft zu einer Datei meines Projekts wird das Ganze neu kompilieren ...)
Ich möchte Sie auf diesen Thread in den Apple-Entwicklerforen verweisen, der weitere Informationen zu diesem Problem enthält (und ab und zu auch die Kommunikation der Apple-Entwickler zu diesem Thema zu schätzen weiß).
Grundsätzlich haben sich die Leute ein paar Dinge ausgedacht, um den inkrementellen Build zu verbessern:
- Fügen Sie eine
HEADER_MAP_USES_VFS
Projekteinstellung hinzu, die auf festgelegt isttrue
- Deaktivieren Sie
Find implicit dependencies
Ihr Schema - Erstellen Sie ein neues Projekt und verschieben Sie Ihre Dateihierarchie in das neue.
Ich werde Lösung 3 ausprobieren, aber Lösung 1/2 hat bei uns nicht funktioniert.
Was in dieser ganzen Situation ironischerweise lustig ist, ist, dass wir beim Betrachten des ersten Beitrags zu diesem Thema Xcode 6 mit schnellem 1 oder schnellem 1.1-Code verwendet haben, als wir die erste Kompilierung der Kompilierung erreichten und jetzt, ungefähr zwei Jahre später, trotz tatsächlicher Verbesserungen von Apple Die Situation ist genauso schlimm wie bei Xcode 6. Wie ironisch.
Ich bedaure es WIRKLICH , Swift für unser Projekt gegenüber Obj / C gewählt zu haben, da es täglich frustriert ist. (Ich wechsle sogar zu AppCode, aber das ist eine andere Geschichte)
Wie auch immer, ich sehe, dass dieser SO-Beitrag zum Zeitpunkt des Schreibens mehr als 32.000 Aufrufe und 143 Ups hat, also bin ich wohl nicht der einzige. Bleib dran, Leute, obwohl du in dieser Situation pessimistisch bist, könnte am Ende des Tunnels etwas Licht sein.
Wenn Sie die Zeit (und den Mut!) Haben, begrüßt Apple wohl das Radar.
Bis zum nächsten Mal! Prost
UPDATE Mit Xcode 9
Stolpert dieser heute. Xcode führte leise ein neues Build-System ein, um die derzeitige schreckliche Leistung zu verbessern. Sie müssen es über die Arbeitsbereichseinstellungen aktivieren.
Habe es schon versucht, werde diesen Beitrag aber aktualisieren, nachdem er fertig ist. Sieht aber vielversprechend aus.