Xcode 6 Beta 6を使用しています。
これはしばらくの間私を悩ませてきたものですが、それは現在ほとんど使用することができない状態に達しています。
私のプロジェクトは、65個のSwiftファイルといくつかのブリッジされたObjective-Cファイル(まさしく問題の原因ではありません)の適切なサイズになり始めています。
Swiftファイルを少し変更すると(アプリでほとんど使用されないクラスに単純な空白を追加するなど)、指定したターゲットのSwiftファイル全体が再コンパイルされます。
より詳細な調査の結果、コンパイラ時間のほぼ100%を占めているのは、CompileSwift
Xcodeがswiftc
ターゲットのすべてのSwiftファイルに対してコマンドを実行するフェーズであることがわかりました。
さらに調査を行ったところ、アプリデリゲートをデフォルトのコントローラーでのみ維持した場合、コンパイルは非常に高速でしたが、プロジェクトファイルを追加していくと、コンパイル時間が非常に遅くなり始めていました。
現在、ソースファイルは65個しかないため、毎回コンパイルするのに約8/10秒かかります。それほど迅速ではありません。
私は除いて、この問題について話して任意のポスト見ていないこれを、私はその場合には一つだけだ場合、私は思ったんだけどだから、Xcodeの6の古いバージョンでした。
更新
Alitfire、Euler、CryptoSwiftのようなGitHub上のいくつかのSwiftプロジェクトを確認しましたが、実際に比較するのに十分なSwiftファイルがありませんでした。適切なサイズで開始していることがわかった唯一のプロジェクトはSwiftHNでした。ソースファイルが12個しかなかったとしても、同じことを確認できましたが、1つの単純なスペースとプロジェクト全体で再コンパイルが必要でした。少し時間(2/3秒)。
アナライザーとコンパイルの両方が非常に高速であるObjective-Cコードと比較すると、これはSwiftが大きなプロジェクトを処理することができないように感じますが、私が間違っていると言ってください。
Xcode 6 Beta 7での更新
まだ改善はありません。これはとんでもないことになり始めています。#import
Swiftに欠けているので、Appleがこれをどのように最適化できるかは本当にわかりません。
Xcode 6.3およびSwift 1.2での更新
Appleはインクリメンタルビルド(および他の多くのコンパイラ最適化)を追加しました。これらの利点を確認するには、コードをSwift 1.2に移行する必要がありますが、AppleはXcode 6.3にそのためのツールを追加しました。
しかしながら
私のようにあまり早く喜んではいけません。ビルドをインクリメンタルにするために使用するグラフソルバーは、まだ十分に最適化されていません。
実際、最初に、関数のシグネチャの変更は確認されないため、1つのメソッドのブロックにスペースを追加すると、そのクラスに依存するすべてのファイルが再コンパイルされます。
第二に、変更がそれらに影響を与えない場合でも、再コンパイルされたファイルに基づいてツリーを作成するようです。たとえば、これらの3つのクラスを別のファイルに移動した場合
class FileA: NSObject {
var foo:String?
}
class FileB: NSObject {
var bar:FileA?
}
class FileC: NSObject {
var baz:FileB?
}
これで、を変更するFileA
と、コンパイラーは明らかFileA
に再コンパイルするようにマークします。また、再コンパイルしますFileB
(それはへの変更に基づいてOKでしょうFileA
)、しかしまたFileC
のでFileB
、再コンパイル、およびされているので、それはかなり悪いですFileC
決してを使用していないFileA
ここに。
依存関係ツリーソルバーが改善されることを願っています... このサンプルコードでレーダーを開きました。
Xcode 7ベータ5およびSwift 2.0での更新
昨日Appleがベータ5をリリースし、リリースノートの中に次のように表示されました。
Swift言語とコンパイラ•インクリメンタルビルド:関数の本体のみを変更しても、依存ファイルが再ビルドされなくなりました。(15352929)
私はそれを試してみましたが、今は本当に(本当に!)うまく機能していると言わなければなりません。彼らは迅速にインクリメンタルビルドを最適化しました。
swift2.0
XCode 7ベータ5を使用して、ブランチを作成し、コードを最新の状態に保つことを強くお勧めします(コンパイラーの機能強化に満足します(ただし、XCode 7のグローバルな状態はまだ遅く、バグが多いと思います)。
Xcode 8.2での更新
この問題に関する私の最後の更新からしばらく経ちましたので、ここにあります。
私たちのアプリは現在、ほぼ独占的にSwiftコードの約20k行です。Swift 2とSwift 3よりも移行が進んだ。2014年半ばのMacbook pro(2.5 GHz Intel Core i7)でコンパイルするには約5/6分かかりますが、クリーンビルドでは問題ありません。
ただし、アップルが次のように主張しているにもかかわらず、インクリメンタルビルドはまだ冗談です。
小さな変更のみが発生した場合、Xcodeはターゲット全体を再構築しません。(28892475)
明らかに、私はこのナンセンスをチェックした後、私たちの多くが笑っただけだと思います(プロジェクトのファイルにプライベート(プライベート!)プロパティを1つ追加すると、すべてが再コンパイルされます...)
私はあなたに問題についていくつかのより多くの情報を持っているApple開発者フォーラムのこのスレッドをあなたに指摘したいと思います(そして時々問題に関するApple開発者のコミュニケーションに感謝します)
基本的に、人々はインクリメンタルビルドを改善するためにいくつかのことを考え出しました:
HEADER_MAP_USES_VFS
プロジェクト設定セットを追加true
Find implicit dependencies
スキームから無効にする- 新しいプロジェクトを作成し、ファイル階層を新しいプロジェクトに移動します。
ソリューション3を試してみますが、ソリューション1/2は機能しませんでした。
この全体的な状況で皮肉なことに面白いのは、この問題の最初の投稿を見て、最初のコンパイルが遅くなったときにSwift 1またはSwift 1.1のコードでXcode 6を使用していたことです。 Xcode 6の場合と同じように状況は悪いです。
私は実際には本当にためにそれが必要とする毎日欲求不満の私たちのプロジェクトのためのObj / C上スウィフトを選ぶ後悔します。(私もAppCodeに切り替えますが、それは別の話です)
とにかく、このSOの投稿には、この記事の執筆時点で32k以上のビューと143のアップがあることがわかります。この状況に悲観的であるにもかかわらず、トンネルの端に若干の光があるかもしれません。
時間があれば(そして勇気も!)、Appleはこれに関するレーダーを歓迎すると思います。
次回まで!乾杯
Xcode 9での更新
今日これにつまずく。Xcodeは静かに新しいビルドシステムを導入し、現在のひどいパフォーマンスを改善しました。ワークスペースの設定で有効にする必要があります。
まだ試してみましたが、完了したらこの投稿を更新します。有望に見えますが。