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).