web-dev-qa-db-ja.com

コンパイル時間が非常に遅い

私のプロジェクトは、〜350個のSwiftファイルと〜40個のココアポッドの依存関係で構成されています。

プロジェクト全体がSwift 3に移行されるとすぐに、ビルド時間は信じられないほど遅くなり、完全に3分強かかりましたコンパイル。
ファイルを変更せずに再構築すると、妥当な時間内にビルドされることに気付きました。ただし、新しい関数を追加すると、3分以上かかります。
CocoapodsはCompiling Swift source files状態で遅延するため、問題を引き起こしていないようです。

this に従って調査しました:

  1. ターゲットのビルド設定の-Xfrontend -debug-time-function-bodiesOther Swift Flagsフラグを追加しました

  2. プロジェクトを構築する

  3. enter image description here

  4. enter image description here

  5. これを端末にコピーして、pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -100を実行しました

しかし、心配することは何もありませんでした。コンパイルに最も時間がかかったファイルはわずか250ミリ秒でした。 350のファイルすべてがコンパイルに250ミリ秒かかったとしても、次に近いのは100ミリ秒でしたが、これは合計73秒で、これは3分以上のビルドからはずれています。


これらの長いコンパイル時間の原因は何ですか?

Xcode 8およびSwift 3に更新する前に遅くなることはありませんでした。

52
dhint4

更新1:

Swift 3変換を実行せずに新しいプロジェクトを作成し、Swift 3ファイルをインポートしましたが、ビルド時間は変わりません。

アップデート2:

Swift_WHOLE_MODULE_OPTIMIZATION = YESを試しましたが、1つ以上のファイルに変更を加えるとすぐに、インクリメンタルビルドが失敗し、4〜5分以上続く再ビルドがトリガーされます。

アップデート3:

コードベース全体をSwift 3からSwift 2.3に書き直しました。違いはありませんでした。問題はXcode 8コンパイラにあります。

アップデート4:

これら2つのチェックを外すことを確認できます Dependency check はしばらく痛みを軽減しますが、Xcode 8バグはファイル間の依存関係をチェックする方法に関係しているようです。

更新5:

コードベースをSwift 3からSwift 2.3に変換したのは、Xcode 8.2ベータ版が必要とするためです。 (28892475)」。悲しいことに、彼らはバグを修正しておらず、私のコンパイル時間はXcode 8.2 Betaとまったく同じです。

元の投稿:

コメントするのに十分な評判はありませんが、まだいくつかのリソースを共有したかったです。私は何日もこの悲惨さに立ち往生しており、Swift 3へのアップグレードは完全な災害でした。

あなたと同じように遅いファイルを追跡するためにこれを使用していますが、それは私の問題ではありません。 xcodeの他の何かが完了するのに文字通り4分かかります: https://github.com/irskep/Swift_compile_times_parserhttps://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

また、Swiftが気に入らないlazy varsまたはclosuresがないことも確認しました。文字列などを連結するときに+ operatorを使用しないでください。 こちらを参照

何か見つかった場合は、この回答を更新します。Swift 3 ATMで生産的になることはほぼ不可能です。

37

Xcode 8.1を使用しています問題はNil-Coalescing Operatorを使用する辞書にありました

これはビルドに10分かかるときの私のコードです:

    let params: [String:String] = [
        "email": email ?? self.email,
        "clave": password,
        "tipo_documento": documentType?.rawValue ?? self.typeDocument.rawValue,
        "documento": number ?? self.documentNumber,
        "nombre": name ?? self.name,
        "apellidos": lastName ?? self.lastName,
        "fecha_nacimiento": birth?.parse() ?? self.birthDate.parse(),
        "genero": genre?.rawValue ?? self.genre.rawValue,
        "telefono_movil": cel ?? self.cel,
        "direccion": address ?? self.address
    ]

理由はわかりませんが、辞書のコンパイルに時間がかかることがわかります。

enter image description here

次に、次のように変更します。

    var params: [String:String] = [:]
        params["email"] = email ?? self.email
        params["clave"] = password
        params["tipo_documento"] = documentType?.rawValue ?? self.typeDocument.rawValue
        params["documento"] = number ?? self.documentNumber
        params["nombre"] = name ?? self.name
        params["apellidos"] = lastName ?? self.lastName
        params["fecha_nacimiento"] = birth?.parse() ?? self.birthDate.parse()
        params["genero"] = genre?.rawValue ?? self.genre.rawValue
        params["telefono_movil"] = cel ?? self.cel
        params["direccion"] = address ?? self.address

それがあなたの何人かを助けることができることを願っています。

Swift_WHOLE_MODULE_OPTIMIZATION = YES

Xcodeバージョン:8.1 GM

追加するには、ターゲットを選択し、Editor > Add Build Setting > Add User-Defined Settingに移動して、上記を追加します。

私のクリーンビルド時間は、プロジェクトファイル数が800で、35分(Ahem、すみません)から8分に短縮されました。

注:最初にXcode 8.0でこれを試してみましたが、機能しませんでした。

10
metpb

また、string concatenationはSwift3/XCode8で非常に遅いようです:

item.text = item.text + " " + pickerText + " " + (attribute?.Prefix ?? "") + inputText + (attribute?.Suffix ?? "")

〜コンパイルに8〜10秒かかりました

item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"

〜コンパイルに1,6秒かかりました

item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();

〜コンパイルに0,001秒かかりました

10
coyer

Swift(2.3、3ではテストされていません)でのコンパイルに多くの時間がかかるコーディングスタイルがいくつか見つかりました。

a += b 

あるべき

a = a + b

配列も一緒に追加します:

var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d = a + b + c

あるべき

var a = [1,3,4]
var b = [5,6,7,8]
var c = [8,4,3,5]
var d : [Int] = []
d.appendContentsOf(a)
d.appendContentsOf(b)
d.appendContentsOf(c)

最後の最適化では、1つのメソッドのコンパイル時間がかかりました9800msから5.5ms ...

5
Ruud Visser

17ファイルのSwift 2xプロジェクトをSwift 3に移行しましたが、すべてのファイルで28の警告と55のエラーがありました。コンパイル時間は4〜5分でした。

無効化

Find Implicit Dependancies 

スキームで

Swift_WHOLE_MODULE_OPTIMIZATION = YES 

マイナーな改善のみを行いました。

最終的に各ファイルの警告とエラーをクリアしたため、コンパイル時間が短縮され、数秒になりました。 IDEは本来の動作をしています。エラーをほぼリアルタイムで検出し、迅速にコンパイルします。

まず、最後のコンパイル以降にそのファイルを編集していない場合でも、コンパイラがエラーまたは警告を伴うすべてのファイルを再コンパイル(または少なくともクロスチェック)しているように見えます。

第二に、ファイル間で依存するエラー/警告が多すぎる場合、コンパイラがボトルネックになり、速度が低下します。

2
obelisk

複数の文字列を連結すると、コンパイル時間が長くなる可能性があります。たとえば、私の場合は、次の行のためにコンパイル時間が非常に長くなります。

let fecha = post.dia + " " + post.num_dia + " " + post.mes + " - " + post.hora

コードをこれに変更すると、数秒でコンパイルが完了しました:

var fecha = post.dia!
fecha = fecha + " "
fecha = fecha + post.num_dia!
fecha = fecha + " "
fecha = fecha + post.mes!
fecha = fecha + " - "
fecha = fecha + post.hora!
0
Mario Jaramillo

コンパイルの問題が発生するたびに、アプリに含まれているサードパーティのSDKを厳密に調べ、コーディングテクニックを見つけようとします。

アプリでこの問題に2回直面し、Swift 3 ????に悩まされているように感じました。両方の時代の理由が異なっていました。

初めて、アプリに AASignatureView という名前のライブラリを追加したことがわかりました。このライブラリが追加されてから、コンパイル時間は地獄のように増えました。シミュレーターでアプリを実行するのに12〜15分近くかかりました。このライブラリをコードから削除して VMSignatureView を追加すると、問題は解決し、コンパイル時間が通常の状態になりました。

2回目は、いくつかの文字列を追加するコードを作成した後にこの問題に直面しました。これらのメソッドは両方とも、アプリのコンパイル時間を地獄に変えました

a = a + b

そして

a += b

次に、コードを以下のように変更し、問題を解決しました。

a = "a\(strSometihng),\(strAnother)"
0
Vaibhav Saran