我在输入一些“简单”代码时也经历了100%+ CPU。一些小巧的技巧可以让您的代码更快速地构建swift-parser。
不要在字符串中使用“+”concatinator。对我来说,这很快就会引起缓慢。 每个新的“+”都会使解析器进行爬网,并且每次在函数体中的某处添加新的字符时,都必须重新解析代码。
相反的:
var str = "This" + String(myArray.count) + " is " + String(someVar)
使用的模板语法,这似乎更有效的迅速解析:
这样,我基本上注意到的strlen没有限制使用内联瓦尔“\ (*)“。
如果您有计算,使用+/* - 然后将它们分成较小的部分。
相反的:
var result = pi * 2 * radius
使用:
var result = pi * 2
result *= radius
它可能看起来不那么高效,但迅速解析器快得多这种方式。 某些公式不会编译,如果它们需要很多操作,即使它们在数学上是正确的。
如果你有一些复杂的计算,然后把它放在一个func。通过这种方式,解析器可以解析它一次,并且不必在每次更改函数体中的某些内容时重新解析该解析器。
因为如果你在函数体中有一个计算,那么如果类型,语法等仍然是正确的,那么swift分析器每次都会检查它。如果一条线在计算之上改变,那么计算/公式中的一些变量可能已经改变。如果你把它放在一个外部函数中,那么它将被验证一次,并且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)
}
雨燕的XCode 6.1仍然是非常错误的,但如果你遵循这些简单的技巧,编辑代码再次变得可以接受我更喜欢swift,因为它摆脱了.h文件,并使用更清晰的语法。还有很多类型转换需要像“myVar as AnyObject”那样,但是与复杂的objective-c项目结构和语法相比,这是更小的恶意。另一个经验,我尝试了SpriteKit,这很有趣,但它的效率很高,如果你不需要60fps的持续重绘。如果你的“精灵”不经常改变,使用旧的CALayers对于CPU来说会更好。如果你没有改变图层的内容,那么CPU基本上是空闲的,但是如果你有一个SpriteKit应用程序在后台运行,那么其他应用程序中的视频播放可能会由于60fps更新循环而受到影响。
有时xcode在编译时显示奇怪的错误,那么它有助于进入菜单“产品>清理”并再次编译,似乎是缓存的错误实现。
另一个改善解析xcode遇到你的代码时的另一个好方法是在另一个stackoverflow帖子here中提到。基本上你会复制你的所有内容。swift文件转换为外部编辑器,然后通过函数功能复制它并查看瓶颈位置。这实际上帮助我在xcode恢复到合理的速度后,在我的项目100%CPU疯狂后。在将代码复制回来时,可以对其进行重构,并尽量保持函数体的简短性,并简化函数/公式/表达式(或分成几行)。
我和你有同样的问题。经常Xcode告诉我“SourceKit终止,编辑暂时有限” – idmean 2014-09-20 11:01:14
是的,这也是另一个问题,我不确定它们是相关的。即使发生错误,速度也很慢。 – mllm 2014-09-20 11:08:59
我确定他们是相关的。在测试版5中,我更频繁地看到该消息,并且我发现在任何时候该建议都无效。 (当我键入一些字符,并按Esc触发建议) – idmean 2014-09-20 11:10:49