Xcode 6带有Swift超慢速打字和自动完成功能

时间:2014-09-20 10:58:22

标签: ios xcode autocomplete swift xcode6

当您键入代码时,使用Swift的只是我或Xcode 6(6.0.1)似乎超慢,尤其是在自动完成时?

一个普通的Objective-C类,即使在Swift项目中,它的工作方式几乎和以前一样,所以它的Swift会杀死它。

是否有其他人遇到同样的不便?您对如何提高性能有任何想法吗?

  • 我试着玩一些设置,但没有运气。
  • 我当然也试过没有运气重启Xcode和电脑。
  • 没有其他重 应用程序已打开。

我使用2009年中期的Macbook Pro(2.26 GHz Intel Core 2 Duo),配备8GB RAM和SSD HD,这根本不是最新的,但仍然不是完整的垃圾。

令人感到遗憾的是,我很高兴开始使用Swift,现在真的让人无法忍受。

思考/提示?

11 个答案:

答案 0 :(得分:82)

  • 退出Xcode并重新启动Mac不是必需的,但首选。
  • 删除文件夹的内容 〜/库/开发商/ Xcode中/ DerivedData
  • 删除内容〜/ Library / Caches / com.apple.dt.Xcode

这是暂时的解决方案,但效果很好。

使用脚本编辑器应用程序在脚本下面。

tell application "Terminal"
    do script "rm -frd ~/Library/Developer/Xcode/DerivedData/*"
    do script "rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"
end tell

或者,您可以为终端创建一个别名,如下所示:

alias xcodeclean="rm -frd ~/Library/Developer/Xcode/DerivedData/* && rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"

您可以将其添加到~/.bash_profile,然后在每次要清除这两个文件夹时在命令行上键入xcodeclean

答案 1 :(得分:13)

我在键入一些"简单"时也经历了100%+ CPU。码。通过构造代码的方式使swift-parser更快速的一些小技巧。

不要使用" +"字符串中的concatinator。对我来说,这很快就会触发缓慢。 每个新的" +"使解析器处于爬行状态,每次在函数体中的某处添加新的char时,它都必须重新解析代码。

而不是:

var str = "This" + String(myArray.count) + " is " + String(someVar)

使用模板语法,在swift中解析效率似乎更高效:

var str = "This \(myArray.count) is \(someVar)"

这种方式我基本上注意到strlen没有限制内联变量" \(*)"

如果你有计算,使用+ / * - 然后将它们分成更小的部分。

而不是:

var result = pi * 2 * radius 

使用:

var result  = pi * 2
    result *= radius

它可能看起来效率较低,但快速解析器的速度要快得多。 如果一些公式必须进行许多操作,即使它们在数学上是正确的,也不会编译。

如果你有一些复杂的计算,那么把它放在一个函数中。这样解析器可以解析一次,并且不必在每次更改函数体中的内容时重新解析它。

因为如果你的函数体中有一个计算,那么如果类型,语法等仍然正确,那么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 )

但如果我把它放在一个函数中并稍后调用它,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仍然非常错误,但如果您遵循这些简单的技巧,编辑代码将再次被接受。我更喜欢快速,因为它摆脱.h文件并使用更清晰的语法。仍然需要很多类型转换,例如&#34; myVar作为AnyObject&#34; ,但那是与复杂的Objective-c项目结构和语法相比较小的邪恶。

另外另一种体验,我尝试过使用SpriteKit很有趣,但是如果你不需要以60fps的速度进行持续的重绘,那么效率非常高。如果您的&#34; sprites&#34;使用旧的CALayers对CPU来说要好得多。不要经常改变。如果你不改变图层的.contents,那么CPU基本上是空闲的,但如果你有一个在后台运行的SpriteKit应用程序,那么其他应用程序中的videoplayback可能会因为60fps的硬限制更新循环而开始出现断断续续的情况。 / p>

有时xcode在编译时显示奇怪的错误,然后进入菜单&#34;产品&gt;清洁&#34;并再次编译,似乎是缓存的错误实现。

另一个stackoverflow帖子here中提到了另一种在xcode陷入代码时改进解析的好方法。基本上,您将.swift文件中的所有内容复制到外部编辑器中,然后通过功能将其复制回来,看看您的瓶颈在哪里。在我的项目因100%CPU疯狂之后,这实际上帮助我再次使xcode达到合理的速度。在复制你的代码时,你可以重构它并尝试保持你的函数体简短,函数/公式化/表达式简单(或分成几行)。

答案 2 :(得分:10)

自Xcode 4以来,自动完成功能被破坏。在Apple决定解决这个2年前的错误之前,唯一的解决方案是在XCode的首选项上完成代码完成 OFF (下图中的第一个选项) )。

您可以在需要时点击CTRL spaceESC手动继续享受完成。

对于100%的案例,这是唯一有效的解决方案。

enter image description here

我最近发现的另一件事是:如果你在Xcode上使用插件,那就不要了。全部删除它们。他们使问题变得更糟。

答案 3 :(得分:5)

您使用的是Spotify吗? 我在2009年中期的iMac(2.66Ghz)上安装了Yosemite GM与Xcode 6.1 GM有同样的问题。我发现一个名为“SpotifyWebHelper”的过程总是标记为红色,因为没有响应,所以我禁用了“从网络开始”选项spotify,现在Xcode似乎运行得更好。

答案 4 :(得分:2)

即使在Xcode 6.3中我也有同样的问题

  • 超慢自动填充
  • 超慢索引
  • swift和SourceKitService的巨大CPU使用率
  • SourceKitService的大量内存使用

所有这一切都发生在相对较小的项目中。我尝试了所有可以找到的修复:

  • 删除〜/ Library / Developer / Xcode / DerivedData / *
  • 删除〜/ Library / Caches / com.apple.dt.Xcode / *
  • 从代码中删除所有“+”字符串组合
  • 删除了所有可疑字典声明

这些都没有真正帮助我的项目。

实际解决了我的问题是:

  • 将每个班级的每一端放在自己的文件中
  • 将每个扩展名放在自己的文件中(Class + ExtName.swift)
  • 在自己的文件中放置“超出类swift方法”

现在我的CPU使用率接近于零,内存使用率低,而且完成速度也非常快。

答案 5 :(得分:2)

通常,将缓存文件夹(DerivedData)移动到SSD驱动器(特别是在我的情况下 - 连接到thunderbolt出口的外部存储器)已经大大提高了我的Xcode性能。编译时间和应用程序周围的一般想知道大概是10次更快..也将整个git文件夹移动到SSD,这大大提高了git性能。

答案 6 :(得分:2)

直到XCode 7.2才痛苦。

Apple在XCode 7.3中修复了它,现在它就像一个魅力。它的速度非常快,功能强大,因为它似乎有点像文件的模糊搜索:你不必实际输入方法/属性的确切开头,它就会出现在命题列表中。

答案 7 :(得分:2)

折叠所有方法会有所帮助。

命令-alt-shift-left arrow可以解决问题......

折叠/展开当前方法或结构使用:

折叠:命令 - alt-左箭头

展开:命令 - 右 - 右箭头

答案 8 :(得分:1)

我发现通常发生在你:

  • 在单个陈述中有长表达式(请参阅this answer
  • 在单个表达式中混合多个自定义运算符

第二种情况似乎是在最新的xcode版本中修复的。示例:我定义了2个自定义运算符&lt;&amp;&amp;&gt;和&lt; ||&gt;,并在a <&&> b <&&> c <||> d这样的表达式中使用。分割成多行解决了这个问题:

let r1 = a <&&> b
let r2 = r1 <&&> c
let r3 = r2 <||> d

我希望您的案件由上述2中的一个涵盖...请在案例中发表评论

答案 9 :(得分:1)

SourceKitService处理代码中的评论也很笨拙,嵌入式评论也会减慢评估速度。

所以,如果你有能力删除像这样的大量嵌入式评论:

/*
 * comment 
    /*
     * embedded comment
     */
 */

这肯定也有帮助。

注意: 在我的情况下,我的Xcode 7.3.1(7D1014)实际上阻止了我输入任何字母,当文件有大约700行评论时嵌入式评论。最初我从那个.swift文件中删除了该块,Xcode又重新活了起来。我尝试通过删除嵌入式注释来逐个添加我的注释,它仍然比平常慢,但如果没有嵌入注释,它会显示出更好的性能。

答案 10 :(得分:1)

我遇到了同样的问题,其中打字在特定的课程中滞后,结果是

/* Long multiline comments */

正在减慢打字速度。