在键入一些“简单”代码时,我还体验了100%+的CPU。通过构造代码的方式可以使快速解析器更快的一些小技巧。
请勿在字符串中使用“ +”修饰符。对我来说,这会很快触发缓慢。每个新的“ +”都会使解析器爬行,并且每次在函数体中的某个位置添加新的char时,它都必须重新解析代码。
代替:
var str = "This" + String(myArray.count) + " is " + String(someVar)
使用模板语法来快速解析似乎效率更高:
var str = "This \(myArray.count) is \(someVar)"
这样,我基本上注意到inline vars“ \(*)”在strlen中没有限制。
如果您有使用+ / *-的计算,则将其拆分为较小的部分。
代替:
var result = pi * 2 * radius
用:
var result = pi * 2
result *= radius
它看起来效率较低,但是快速解析器以这种方式更快。即使某些公式必须进行许多运算,即使它们在数学上是正确的,它们也不会编译。
如果您有一些复杂的计算,则将其放在一个函数中。这样,解析器可以解析一次,而不必每次在函数体中进行更改时都重新解析它。
因为如果您在函数体内有一个计算,那么无论类型,语法等是否仍然正确,快速解析器都会以某种方式对其进行检查。如果一行在计算上方变化,则您的计算/公式中的某些变量可能已更改。如果将其放在外部函数中,则将对其进行一次验证,而swift很高兴它将是正确的,并且不会不断对其进行重新解析,这会导致CPU使用率很高。
这样我在打字时从每次按键的100%降低到CPU不足。例如,内联在函数主体中的这3行可以使swiftparser爬行。
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 )
但是,如果我将它放在一个func中并稍后再调用,swiftparser会更快
// 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和XCode 6.1仍然存在很多问题,但是如果您遵循这些简单的技巧,则可以再次接受编辑代码。我更喜欢swift,因为它摆脱了.h文件并使用了更简洁的语法。仍然需要进行很多类型转换,例如“ myVar as AnyObject”,但是与复杂的Objective-C项目结构和语法相比,这是更小的麻烦。
另一种体验是,我尝试了SpriteKit,该工具使用起来很有趣,但如果您不需要以60fps的速度进行恒定重绘,则效率很低。如果您的“精灵”不经常更改,则使用旧的CALayers对于CPU会更好。如果不更改图层的.content,则CPU基本上处于空闲状态,但是如果您在后台运行SpriteKit应用,则由于受限的60fps更新循环,其他应用中的视频播放可能会开始停顿。
有时xcode会在编译时显示奇数错误,然后进入菜单“ Product> Clean”并再次编译将很有帮助,这似乎是缓存的错误实现。
当xcode被代码卡住时,另一种改善解析的好方法在此处的另一个stackoverflow文章中提到。基本上,您将所有内容从.swift文件复制到外部编辑器中,然后通过函数将其复制回去,以查看瓶颈所在。在我的项目疯狂使用100%CPU之后,这实际上帮助我将xcode再次提高到合理的速度。在将代码复制回时,您可以对其进行重构,并尝试使函数主体简短而函数/形式/表达式简单(或分成几行)。