web-dev-qa-db-ja.com

Xcode 6でSwift超スロータイピングとオートコンプリート

コードを入力するとき、特にオートコンプリートでSwiftは超低速のように見えますか?

通常のObjective-Cクラスは、Swiftプロジェクト内にある場合でも、以前とほとんど同じように機能するため、それを殺すのはSwiftです。

他の誰かが同じ不便を経験しますか?パフォーマンスを改善する方法についてのアイデアはありますか?

  • いくつかの設定を試してみましたが、運はありませんでした。
  • もちろん、Xcodeとコンピューターを再起動することもできました。
  • 他の重いアプリは開いていません。

8GB RAMとSSD HDを搭載したMid 2009 Macbook Pro(2.26 GHz Intel Core 2 Duo)を使用します。これはまったく最新のものではありませんが、完全なジャンクではありません。

Swift=を使い始めることに興奮していたのは残念で、今は本当に耐えられません。

考え/ヒント?

112
mllm
  • Xcodeを終了してMacを再起動する必要はありませんが、お勧めします。
  • フォルダー〜/ Library/Developer/Xcode/DerivedDataのcontentを削除します
  • content〜/ 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に追加してから、これらの2つのフォルダーをクリアするたびに、コマンドラインでxcodecleanと入力できます。

また、「単純な」コードを入力しているときに100%以上のCPUを経験しました。コードを構造化する方法により、Swiftパーサーをより高速にするためのいくつかの小さなトリック。

文字列で「+」連結子を使用しないでください。私にとって、これは非常に迅速に遅さを引き起こします。新しい「+」はそれぞれパーサーをクロールし、関数本体のどこかに新しい文字を追加するたびにコードを再解析する必要があります。

の代わりに:

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=パーサーはこの方法ではるかに高速です。いくつかの数式は、数学的に正しい場合でも、多くの操作が必要な場合、コンパイルできません。

複雑な計算がある場合は、関数に入れてください。このように、パーサーは1回解析することができ、関数本体で何かを変更するたびに再解析する必要はありません。

関数本体に計算がある場合、何らかの方法で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) 
}

SwiftとXCode 6.1はまだ非常にバグが多いですが、これらの簡単なトリックに従えば、コードの編集が再び受け入れられるようになります。私はSwiftを好む。それは.hファイルを取り除き、はるかにきれいな構文を使用する。 "myVar as AnyObject"のような多くの型キャストがまだ必要であるが、それはより小さい悪複雑なObjective-Cプロジェクトの構造と構文。

また、別の経験として、使用するのが楽しいSpriteKitを試しましたが、60fpsでの一定の再描画が必要ない場合は非常に非効率的です。 「スプライト」が頻繁に変わらない場合、古いCALayersを使用する方がCPUにとってはるかに優れています。レイヤーの.contentsを変更しない場合、CPUは基本的にアイドル状態になりますが、SpriteKitアプリをバックグラウンドで実行している場合、ハード制限された60fps更新ループにより、他のアプリでビデオ再生が途切れることがあります。

コンパイル中にxcodeが奇妙なエラーを表示する場合があります。それからメニュー「製品>クリーン」に移動して再度コンパイルすると、キャッシュのバグのある実装のように見えます。

Xcodeがコードで動けなくなった場合の解析を改善するもう1つの素晴らしい方法は、別のstackoverflow post here で言及されています。基本的には、すべてのコンテンツを.Swiftファイルから外部エディターにコピーし、機能ごとにコピーして戻し、ボトルネックがどこにあるかを確認します。これは、私のプロジェクトが100%CPUに夢中になった後、実際にxcodeを適切な速度に戻すのに役立ちました。コードをコピーして戻しながら、それをリファクタリングして、関数本体を短くし、関数/式/式を単純にする(または複数の行に分割する)ことを試みることができます。

13

Xcode 4以降、オートコンプリートは壊れています。Appleがこの2年前のバグを修正することを決定するまで、残念なことに、唯一の解決策はコード補完を有効にすることです[〜#〜] off [〜 #〜] XCodeの設定(下の写真の最初のオプション)。

必要に応じてCTRL spaceまたはESCと入力することにより、手動で補完を続けることができます。

これは、すべてのケースで毎回機能する唯一のソリューションです。

enter image description here

私が最近発見したもう1つのことは、Xcodeでプラグインを使用する場合は使用しないでください。それらをすべて削除します。彼らは問題を悪化させます。

10
SpaceDog

Spotifyを使用していますか?同じ問題のあるiMac mid 2009(2.66Ghz)にYosemite GM with Xcode 6.1 GM)をインストールしました。「SpotifyWebHelper」と呼ばれるプロセスは常に赤で応答しないとマークされているため、Spotifyで「Webから開始」オプションを無効にしたため、Xcodeの実行が大幅に改善されたようです。

5

一般的に、キャッシュフォルダー(DerivedData)をSSDドライブ(特に私の場合-Thunderbolt exitに接続された外部ストレージ)に移動すると、Xcodeのパフォーマンスが劇的に向上しました。また、gitフォルダー全体をSSDに移動しました。これにより、gitのパフォーマンスが劇的に向上しました。

2
brkeyal

すべてのメソッドを折りたたむと、少し役立ちます。

command-alt-shift-left arrowはトリックをします...

現在のメソッドを折りたたみ/展開するには、または構造が使用する場合:

折り畳み:command-alt-left arrow

展開:command-alt-right矢印

2
rowdyruckus

XCode 7.2までは苦痛でした。

AppleはXCode 7.3で修正し、今では魅力のように動作します。ファイルのファジー検索のように動作するように見えるため、非常に高速ではるかに強力です:提案のリストに表示するためにメソッド/プロパティの正確な始まりを実際に入力する必要はありません。

2
Bioche

Xcode 6.3でも同じ問題が発生しました

  • 超遅いオートコンプリート
  • 超遅いインデックス
  • SwiftおよびSourceKitServiceによる膨大なCPU使用率
  • sourceKitServiceによる膨大なメモリ使用量

これはすべて、比較的小さなプロジェクトでも発生していました。私は見つけることができるすべての修正を試しました:

  • 〜/ Library/Developer/Xcode/DerivedData/*の削除
  • 〜/ Library/Caches/com.Apple.dt.Xcode/*を削除する
  • コードから結合するすべての「+」文字列を削除します
  • すべての疑わしい辞書宣言を削除

これらのどれも私のプロジェクトでは実際には役に立たなかった。

実際に私の問題を解決したのは:

  • クラスごとに各クラスを独自のファイルに配置する
  • それぞれの拡張子を独自のファイルに配置する(Class + ExtName.Swift)
  • 「クラス外Swiftメソッド」を独自のファイルに配置する

現在、CPU使用率はほぼゼロ、メモリ使用率は低く、完了はかなり高速です。

2
Matej Ukmar

特定のクラスでタイピングが遅れているという同じ問題がありましたが、

/* Long multiline comments */

タイピングを遅くしていました。

1
Aziz Akgul

通常、次の場合に発生することがわかりました。

  • 1つのステートメントに長い式がある( this answer を参照)
  • 単一の式に複数のカスタム演算子を混在させる

2番目のケースは、最新のxcodeリリースの1つで修正されているようです。例:2つのカスタム演算子<&&>と<||>を定義し、a <&&> b <&&> c <||> dなどの式で使用しました。複数の行に分割することで問題が解決しました。

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

上記の2つのうちのいずれかであなたのケースがカバーされることを願っています...どちらのケースでもコメントを投稿してください

1
Antonio

SourceKitServiceは、コード内のコメントを扱うのもちょっと不器用で、埋め込みコメントも遅くなります。

したがって、次のような大量の埋め込みコメントを削除する余裕がある場合:

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

それも間違いなく役立ちます。


注:私の場合、私のXcode 7.3.1(7D1014)は文字通りブロックされましたファイルにコメントが埋め込まれた約700行のコメントがあったときに任意の文字を入力します。最初にそのブロックを.Swiftファイルから削除し、Xcodeが再び有効になりました。埋め込まれたコメントを削除することにより、コメントを部分的に追加しようとしましたが、それは通常よりも遅いですが、埋め込まれたコメントがない場合はパフォーマンスが大幅に向上しました。

1
holex