私のプロジェクトは、〜350個のSwiftファイルと〜40個のココアポッドの依存関係で構成されています。
プロジェクト全体がSwift 3
に移行されるとすぐに、ビルド時間は信じられないほど遅くなり、完全に3分強かかりましたコンパイル。
ファイルを変更せずに再構築すると、妥当な時間内にビルドされることに気付きました。ただし、新しい関数を追加すると、3分以上かかります。
CocoapodsはCompiling Swift source files
状態で遅延するため、問題を引き起こしていないようです。
this に従って調査しました:
ターゲットのビルド設定の-Xfrontend -debug-time-function-bodies
にOther Swift Flags
フラグを追加しました
プロジェクトを構築する
これを端末にコピーして、pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -100
を実行しました
しかし、心配することは何もありませんでした。コンパイルに最も時間がかかったファイルはわずか250ミリ秒でした。 350のファイルすべてがコンパイルに250ミリ秒かかったとしても、次に近いのは100ミリ秒でしたが、これは合計73秒で、これは3分以上のビルドからはずれています。
Xcode 8
およびSwift 3
に更新する前に遅くなることはありませんでした。
Swift 3
変換を実行せずに新しいプロジェクトを作成し、Swift 3
ファイルをインポートしましたが、ビルド時間は変わりません。
Swift_WHOLE_MODULE_OPTIMIZATION = YES
を試しましたが、1つ以上のファイルに変更を加えるとすぐに、インクリメンタルビルドが失敗し、4〜5分以上続く再ビルドがトリガーされます。
コードベース全体をSwift 3
からSwift 2.3
に書き直しました。違いはありませんでした。問題はXcode 8
コンパイラにあります。
これら2つのチェックを外すことを確認できます はしばらく痛みを軽減しますが、Xcode 8
バグはファイル間の依存関係をチェックする方法に関係しているようです。
コードベースを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で生産的になることはほぼ不可能です。
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
]
理由はわかりませんが、辞書のコンパイルに時間がかかることがわかります。
次に、次のように変更します。
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でこれを試してみましたが、機能しませんでした。
また、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秒かかりました
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 ...
17ファイルのSwift 2xプロジェクトをSwift 3に移行しましたが、すべてのファイルで28の警告と55のエラーがありました。コンパイル時間は4〜5分でした。
無効化
Find Implicit Dependancies
スキームで
Swift_WHOLE_MODULE_OPTIMIZATION = YES
マイナーな改善のみを行いました。
最終的に各ファイルの警告とエラーをクリアしたため、コンパイル時間が短縮され、数秒になりました。 IDEは本来の動作をしています。エラーをほぼリアルタイムで検出し、迅速にコンパイルします。
まず、最後のコンパイル以降にそのファイルを編集していない場合でも、コンパイラがエラーまたは警告を伴うすべてのファイルを再コンパイル(または少なくともクロスチェック)しているように見えます。
第二に、ファイル間で依存するエラー/警告が多すぎる場合、コンパイラがボトルネックになり、速度が低下します。
複数の文字列を連結すると、コンパイル時間が長くなる可能性があります。たとえば、私の場合は、次の行のためにコンパイル時間が非常に長くなります。
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!
コンパイルの問題が発生するたびに、アプリに含まれているサードパーティのSDKを厳密に調べ、コーディングテクニックを見つけようとします。
アプリでこの問題に2回直面し、Swift 3 ????に悩まされているように感じました。両方の時代の理由が異なっていました。
初めて、アプリに AASignatureView という名前のライブラリを追加したことがわかりました。このライブラリが追加されてから、コンパイル時間は地獄のように増えました。シミュレーターでアプリを実行するのに12〜15分近くかかりました。このライブラリをコードから削除して VMSignatureView を追加すると、問題は解決し、コンパイル時間が通常の状態になりました。
2回目は、いくつかの文字列を追加するコードを作成した後にこの問題に直面しました。これらのメソッドは両方とも、アプリのコンパイル時間を地獄に変えました
a = a + b
そして
a += b
次に、コードを以下のように変更し、問題を解決しました。
a = "a\(strSometihng),\(strAnother)"