it-swarm.com.de

XCode 8 sehr langsam Swift kompiliert

Seit Swift 3 und XCode8 kompiliert mein Projekt ziemlich langsam ... Jedes Mal, wenn ich einer Datei so viel wie eine leere Zeile hinzufüge, dauert das Rekompilieren eine Minute. Wenn ich die Ausgabe überprüfe, gibt es keine bestimmte Datei, die sehr lange dauert. (Ich habe dieses Tool auch verwendet, um sie zu messen: https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode )

Es scheint immer, 4 Dateien auf einmal zu kompilieren. Der "Rhythmus" ist ziemlich stabil. Nur sehr langsam ...

Außerdem: Wenn ich Dateien öffne oder zwischen Dateien umschalte, kann es sehr lange dauern, bis ich die automatische Vervollständigung oder Fehler/Warnungen erhalte.

Welche Dinge kann ich überprüfen? Ich habe fast das Gefühl, dass es eine Flagge gibt, die ich gesetzt habe und die Build-Geschwindigkeit wie verrückt nach unten zieht.

EDIT: Dies ist keine Lösung für das zugrunde liegende Problem, aber ich habe einige Zeit damit verbracht, mehr Code in Frameworks zu verschieben. Dies machte einen Unterschied (einfach weil es jedes Mal weniger Dateien neu kompilieren muss). Das sollte nicht nötig sein, aber es wurde unerträglich ... Ich suche natürlich immer noch sehr nach einer richtigen Lösung.

36
fancy

Ein Problem bei diesem Problem ist, dass wir nicht wissen, wo die falsche Initialisierung/Deklaration liegt. Eine Lösung, die mein Kollege vorschlägt, ist herauszufinden, welche Funktion lange braucht, um sie zu kompilieren:

  1. Gehen Sie zu Project, um Ihr Ziel auszuwählen
  2. Build Settings -> Swift Compiler - Custom Flags
  3. Zu Other Swift Flags-Xfrontend -warn-long-function-bodies=50 hinzufügen (50 steht für die Zeit in Millisekunden)

danach sollte eine Warnung wie folgt angezeigt werden:

Getter 'frameDescription' benötigte 108ms zum Typcheck (Limit: 50ms)

und danach weißt du was zu tun ist;)

26

Ich hatte das gleiche Problem erst seit dem Upgrade auf Swift 3/XCode 8 und es scheint, dass dies durch große Array-Literale verursacht wird, ähnlich wie this .

Ich konnte das Problem beheben, indem ich den Variablen, die dem Arrayliteral zugewiesen wurden, Typanmerkungen hinzufügte, z.

let array: Array<String> = ["1", "2", "3", "4", "5", "6", "7", "8"]

anstatt

let array = ["1", "2", "3", "4", "5", "6", "7", "8"]
5
Ben Simon

Dies ist ein Problem mit Xcode 8, bei dem die inkrementelle Erstellung nicht korrekt ausgeführt wird. Wenn Sie eine einzelne Swift-Datei bearbeiten, sollte sie nur diese Datei kompilieren. Dies wurde bereits angesprochen: Xcode 8 führt vollständige Neuerstellung des Projekts durch

Die vier Dateien auf einmal klingen so, als würde Xcode das Projekt vollständig neu erstellen. Dies sollte nicht wiederholt werden, wenn Sie nur eine einzelne Zeile in einer Datei ändern.

5
Vlad

In meinem Fall habe ich eine Hilfsfunktion verwendet, um Daten in Firebase zu speichern. Diese Funktion gab ein Wörterbuch mit etwa 20 Elementen zurück und das Kompilieren dauerte etwa 40 Minuten. Meine Lösung bestand darin, ein leeres Wörterbuch zu initialisieren und dann die Elemente einzeln zu someDict hinzuzufügen. Jetzt wird es in weniger als 30 Sekunden kompiliert. Ich hoffe, es hilft.

Vor  

func toAnyObject() -> AnyObject {
  return
      ["BookingAmount":BookingAmount,
     "BookingNumber":BookingNumber,
     "PostCode":PostCode,
     "SelectedBathRow":SelectedBathRow,
     "SelectedBedRow":SelectedBedRow,
     "DateAndTime":DateAndTime,
     "TimeStampDateAndTime":TimeStampDateAndTime,
     "TimeStampBookingSavedInDB": TimeStampBookingSavedInDB,
     "FrequencyName":FrequencyName,
     "FrequecyAmount":FrequecyAmount,
     "insideCabinets": insideCabinets,
     "insideFridge": insideFridge,
     "insideOven": insideOven,
     "laundryWash": laundryWash,
     "interiorWindows": interiorWindows,
     "FullName":FullName,
     "SuppliesName":SuppliesName,
     "SuppliesAmount":SuppliesAmount,
     "FlatNumber":FlatNumber,
     "StreetAddress":StreetAddress,
     "PhoneNumber":PhoneNumber,
     "EmailAddress":EmailAddress] as AnyObject

}

Nach dem  

  func toAnyObject() -> AnyObject {

    var someDict = [String : AnyObject]()
    someDict["BookingAmount"] = self.BookingAmount as AnyObject?
    someDict["BookingNumber"] = self.BookingNumber as AnyObject?
    someDict["PostCode"] = self.PostCode as AnyObject?
    someDict["SelectedBathRow"] = self.SelectedBathRow as AnyObject?
    someDict["SelectedBedRow"] = self.SelectedBedRow as AnyObject?
    someDict["DateAndTime"] = self.DateAndTime as AnyObject?
    someDict["TimeStampDateAndTime"] = self.TimeStampDateAndTime as AnyObject?
    someDict["TimeStampBookingSavedInDB"] = self.TimeStampBookingSavedInDB as AnyObject?
    someDict["FrequencyName"] = self.FrequencyName as AnyObject?
    someDict["FrequecyAmount"] = self.FrequecyAmount as AnyObject?
    someDict["insideCabinets"] = self.insideCabinets as AnyObject?
    someDict["insideFridge"] = self.insideFridge as AnyObject?
    someDict["insideOven"] = self.insideOven  as AnyObject?
    someDict["laundryWash"] = self.laundryWash as AnyObject?
    someDict["interiorWindows"] = self.interiorWindows as AnyObject?
    someDict["FullName"] = self.FullName as AnyObject?
    someDict["SuppliesName"] = self.SuppliesName as AnyObject?
    someDict["SuppliesAmount"] = self.SuppliesAmount as AnyObject?
    someDict["FlatNumber"] = self.FlatNumber as AnyObject?
    someDict["StreetAddress"] = self.StreetAddress as AnyObject?
    someDict["PhoneNumber"] = self.PhoneNumber as AnyObject?
    someDict["EmailAddress"] = self.EmailAddress as AnyObject?

    return someDict as AnyObject
}
2
bibscy

Ich konnte die Kompilierzeiten für Swift-Projekte erheblich reduzieren, da der Nil-Coalescing-Operator und die String-Verkettung vermieden wurden.

In anderen Worten, wo ich so etwas hatte:

let x = "one" + object.nullableProperty ?? ""

Ich habe es geändert

let x = String(format: "one %@", object.nullableProperty ?? "")

Meine Kompilierzeiten sind drastisch gesunken - von 20 Minuten auf 20 Sekunden.

1
Logan Sease

Dies hat bei einem meiner Projekte für mich funktioniert. 

Gehen Sie zu Produkt -> Schema -> Schema bearbeiten. Wählen Sie Build in der linken Seite Spalte und deaktivieren Sie "Suche implizite Abhängigkeiten" Aber dieses Flag sollte Bleiben Sie beim ersten Erstellen des Projekts immer auf dem neuesten Stand.

Quelle

Es war ein einfaches Projekt und es erhöhte einen meiner Builds von 1 Minute auf 2 Sekunden.

Auf einem physischen Gerät habe ich diese Ergebnisse erhalten ... Für ein größeres Projekt (42 Dateien) wurde es nur von 2:36 auf 2:20 reduziert. Dann fügte ich hinzu: Swift_WHOLE_MODULE_OPTIMIZATION = YES to Build Settings als benutzerdefinierte Einstellung . Die Zeit ging auf - 2:00 Uhr zurück

Auf dem Simulator war das Build 49 Sekunden das erste Mal, als ich es verwendete.

Gehen Sie zu Produkt -> Schema -> Schema bearbeiten. Wählen Sie Build in der linken Seite Spalte und deaktivieren Sie "Suche implizite Abhängigkeiten" Aber dieses Flag sollte Bleiben Sie beim ersten Erstellen des Projekts immer auf dem neuesten Stand.

und der Aufbau dauerte 7 Sekunden.

Ich hoffe das hilft.

1
uplearnedu.com

Stellen Sie sicher, dass Sie keine Arrays wie let combinedArrays = array1 + array2 kombinieren. Es gibt auch einen bekannten Fehler für die Typeninferenz, bei dem Swift Zeit verschwendet, um herauszufinden, welcher Typ die combinedArrays sein sollte. Stattdessen sollte [array1, array2].joined() genauso gut funktionieren und viel schneller kompilieren.

0
Dylan Gattey

Eine übliche Praxis, die die Kompilierzeit verlangsamt, ist die Verwendung von Array.append und String.append (oder deren Äquivalent für +-Operator). Für Strings ist es besser, eine formatierte Zeichenfolge anstelle von zu verwenden

let hello = "Hello, "
let world = "World!"
let combinedString = hello + world

du solltest benutzen

let combinedString = "\(hello)\(world)"

Ich kann mich nicht an die genaue Beschleunigung erinnern, aber für diese Linien war es etwa zehnmal. Es wird vermutet, dass dies nur für die kleinsten Projekte eine spürbare Beschleunigung hat. In unserem Projekt sind beispielsweise hunderte von Swift-Dateien sowie viele Objective-C-Dateien vorhanden, und unsere Kompilierzeiten betragen oft 10 Minuten oder mehr, manchmal sogar, wenn die einzige Änderung in einer Nicht-Swift-Datei erfolgte.

0
NRitH