También experimenté 100% + CPU mientras escribía un código "simple". Algunos pequeños trucos para hacer que el analizador rápido sea más rápido por la forma en que estructura su código.
No use el concatinador "+" en cadenas. Para mí, esto desencadena la lentitud muy rápidamente. Cada nuevo "+" lleva al analizador a un rastreo, y tiene que volver a analizar el código cada vez que agrega un nuevo carácter en algún lugar del cuerpo de su función.
En vez de:
var str = "This" + String(myArray.count) + " is " + String(someVar)
Use la sintaxis de plantilla que parece mucho más eficiente para analizar en rápido:
var str = "This \(myArray.count) is \(someVar)"
De esta manera, básicamente noto que no hay límite en strlen con vars en línea "\ (*)".
Si tiene cálculos que usan + / *, divídalos en partes más pequeñas.
En vez de:
var result = pi * 2 * radius
utilizar:
var result = pi * 2
result *= radius
Puede parecer menos eficiente, pero el analizador rápido es mucho más rápido de esta manera. Algunas fórmulas no se compilan, si tienen muchas operaciones, incluso si son matemáticamente correctas.
Si tiene algunos cálculos complejos, póngalos en una función. De esta forma, el analizador puede analizarlo una vez y no tiene que volver a analizarlo cada vez que cambia algo en el cuerpo de su función.
Porque si tiene un cálculo en el cuerpo de su función, de alguna manera el analizador rápido lo verifica cada vez que los tipos, la sintaxis, etc., siguen siendo correctos. Si una línea cambia por encima del cálculo, es posible que algunas variables dentro de su cálculo / fórmula hayan cambiado. Si lo coloca en una función externa, se validará una vez y Swift se alegra de que sea correcto y no lo analice constantemente, lo que está causando un alto uso de la CPU.
De esta manera pasé del 100% en cada pulsación de tecla a CPU baja mientras escribía. Por ejemplo, estas 3 líneas colocadas en línea en su cuerpo funcional pueden hacer que el analizador rápido se arrastre.
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 )
pero si lo pongo en una función y lo llamo más tarde, el analizador rápido es mucho más rápido
// 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 y XCode 6.1 todavía tienen muchos errores, pero si sigues estos sencillos trucos, la edición de código vuelve a ser aceptable. Prefiero mucho Swift, ya que elimina los archivos .hy usa una sintaxis mucho más limpia. Todavía se necesitan muchos tipos de conversión como "myVar como AnyObject", pero ese es el mal menor en comparación con la estructura y sintaxis del complejo proyecto objetivo-c.
También otra experiencia, probé el SpriteKit, que es divertido de usar, pero es bastante ineficaz si no necesitas un repintado constante a 60 fps. Usar CALayers antiguos es mucho mejor para la CPU si tus "sprites" no cambian tan a menudo. Si no cambia el contenido de las capas, entonces la CPU está básicamente inactiva, pero si tiene una aplicación SpriteKit ejecutándose en segundo plano, la reproducción de video en otras aplicaciones puede comenzar a tartamudear debido al ciclo de actualización de 60 fps ilimitado.
A veces, xcode muestra errores extraños durante la compilación, luego ayuda ir al menú "Producto> Limpiar" y compilarlo de nuevo, parece ser una implementación defectuosa del caché.
Otra excelente manera de mejorar el análisis cuando xcode se atasca con su código se menciona en otra publicación de stackoverflow aquí . Básicamente, copia todo el contenido de su archivo .swift en un editor externo, y luego, función por función, cópielo nuevamente y vea dónde está su cuello de botella. En realidad, esto me ayudó a que xcode volviera a alcanzar una velocidad razonable, después de que mi proyecto se volviera loco con el 100% de la CPU. mientras copia su código, puede refactorizarlo e intentar mantener sus cuerpos de función cortos y sus funciones / formuladores / expresiones simples (o divididas en varias líneas).