web-dev-qa-db-ja.com

Xcodeでビルド時間を短縮/コンパイル時間を短縮する方法は?

Xcodeプロジェクトのビルド時間を短縮するために一般的に使用できる戦略は何ですか?私はXcode固有の戦略に主に興味があります。

Xcodeを使用してiPhone開発を行っていますが、私のプロジェクトは徐々に大きくなっています。コンパイル/リンクフェーズは、思ったよりも時間がかかり始めています。

現在、私は:

  • 静的ライブラリを使用して、メインプロジェクトをクリーンアップしてビルドするたびにほとんどのコードをコンパイルする必要がないようにします

  • アプリケーションからほとんどのリソースを削除し、可能な場合はiPhoneシミュレーターでハードコードされたファイルシステムパスでテストします。これにより、リソースを変更するたびにリソースをパッケージ化する必要がなくなります。

「依存関係の確認」フェーズには、思ったより時間がかかるようです。それを減らすためのヒントも歓迎します!

68
Brad Parks

多くの場合、できる最大のことは、ヘッダーファイルのインクルードを制御することです。

ソースコードに「余分な」ヘッダーファイルを含めると、コンパイルが大幅に遅くなります。これにより、依存関係のチェックに必要な時間が長くなる傾向もあります。

また、ヘッダーに他のヘッダーを含める代わりに 前方宣言 を使用すると、依存関係の数を大幅に削減し、すべてのタイミングを支援できます。

53
Reed Copsey

SpotifyでiOS開発サイクルをどのように改善したかについて、広範なブログ記事を書きました。

iOS Edit-Build-Testサイクルからの待機時間を50%削減

それは煮詰めた:

1)dSYMバンドルの生成を停止します。

2)Clangを使用する場合は、-O4を使用したコンパイルを避けてください。

22
fons

個人的には、Mac開発プロジェクトのためにコンパイラをLLVM-Clangに切り替えましたが、ビルド時間が劇的に短縮されました。 LLVM-GCCコンパイラーもありますが、これがビルド時間に役立つかどうかはわかりませんが、LLVM-ClangがiPhoneアプリのコンパイルで機能しない場合は、これも試してみてください。

IPhoneでの開発でLLVMがサポートされているかどうかは100%わかりませんが、ニュースフィードでそれを読んだことを覚えていると思います。これはコードに実装できる最適化ではありませんが、試してみる価値はあります!

17
Form

8GBのRAMを使用していない場合は、今すぐアップグレードしてください。

Macbook Proを4GBから8GBにアップグレードしました。プロジェクトのビルド時間は2:10から0:45になりました。私は改善によって床に落ちました。また、インデックス作成時など、研究の迅速なWebブラウジングや一般的なXcodeパフォーマンスを実現します。

13
Dan Carter

Xcodeがタスクを実行するために使用するスレッドの数は、CPUのコアと同じ数にデフォルト設定されます。たとえば、Intel Core i7を搭載したMacには2つのコアがあるため、デフォルトでXcodeは最大2つのスレッドを使用します。コンパイル時間は多くの場合、CPUバインドではなくI/Oバインドであるため、Xcodeが使用するスレッド数を増やすと、コンパイルのパフォーマンスが大幅に向上します。

3、4、または8スレッドを使用するようにXcodeを設定してみて、どのスレッドがユースケースに最適なパフォーマンスを提供するかを確認してください。

次のように、ターミナルからXcodeが使用するプロセスの数を設定できます。

defaults write com.Apple.Xcode PBXNumberOfParallelBuildSubtasks 4

詳細については Xcode User Defaults をご覧ください。

11
memmons

簡単な答え:ローカルネットワークでXcodeを実行している別のマシンを追加します。 Xcodeはdistccを組み込んで分散コンパイルを行います。 Bonjourを使用して他のビルドホストを見つけることもできるため、これを設定するプロセスが大幅に簡素化されます。大規模なビルドの場合、分散により、ビルドマシンの数にほぼ直線的に比例する速度の向上が得られます(2台のマシンが半分の時間、3台が3分の1の時間を要します)。

これを設定する方法については、 this development doc を参照してください。また、プリコンパイル済みヘッダーの使用や予測ビルドなど、その他の便利なビルド時間改善戦略も備えています。

編集:悲しいことに、AppleはXcode 4.3でこの機能を削除しました: http://lists.Apple.com/archives/xcode-users/2012/Mar/msg00048 .html

Xcode 5にはCIを実行できるサーバーバージョンがありますが、アドホック開発者のビルドに利点をもたらすとは思いません。ただし、ビルド時間を大幅に短縮するための未発表の機能がいくつかあります。

11
Tim Keating

(少なくともiOSプロジェクトの場合)コンパイル時間を半分にするための1つの大きなヒントは、Build Settings/Architectures/Build Active Architecture Onlyto[〜#〜] yes [〜#〜]

これが(特に64ビットiPad/64ビットコンパイラの登場により)行うことは、ビルドしないアーキテクチャではないバイナリ現在使用中。

アプリストアへの送信時にこの設定を再度有効にすることを忘れないでください、またはバイナリが検証されません。

7
bobobobo

スクリプトを使用して、RAMドライブと、プロジェクトのいくつかの「前方宣言」最適化cleanを使用しましたビルド時間は53秒から20秒になりました。

AppStoreでGuiを取得したいと思いましたが、コマンドラインを使用することを選択しました。スクリプトをgitリポジトリの一部として配置しました。

ビルド時間を確認するには、ターミナルに次のように入力します: "defaults write com.Apple.dt.Xcode ShowBuildOperationDuration YES"

Xcodeを再起動して、ツールバーのビルド時間を確認します。 (これは、objective-cを使用したクリーンでないビルド時間です) Cached build times

お好みに合わせてスクリプトを調整します。 -スクリプトが派生データフォルダをクリアすることに注意してください。

#!/bin/sh

#2 GIG RAM
GIGA_BYTES=$((2*1024*1024*1024))

# a sector is 512 bytes
NUMSECTORS=$((${GIGA_BYTES}/512))

#ram disk
mydev=`hdiutil attach -nomount ram://$NUMSECTORS`
newfs_hfs $mydev

# make mount point
MOUNT_POINT=/Users/your_user_name/Library/Developer/Xcode/DerivedData

# ******************************************* 
# ** WARNING - MOUNT POINT WILL BE DELETED ** 
# *******************************************
rm -rf ${MOUNT_POINT}
mkdir -p ${MOUNT_POINT}

# mount
mount -t hfs $mydev ${MOUNT_POINT}
echo unmount $(MOUNT_POINT)

効果を確認し、RAM Drive:を制御するには

mount                       - see mount points
umount mount_point          - unmount point
diskutil list               - see disks
diskutil eject /dev/diskX   - eject the disk
df -ahl                     - see free space

注:基本的に、macOsが提供するhdiutilを使用します。 -kernelオプション(ディスクへのスワップなし)をオンにしようとしましたが、実装されていないと言って、マシンで失敗しました。

新しいファイルシステムのコピー機能は非常に高速であり、このスクリプトが冗長になる可能性があるため、新しいOSがまもなくリリースされる可能性があります。

4
Wayne

コンパイルを防ぐために、最も頻繁に使用されるファイルに静的ライブラリを使用することについて言及しました。頻繁に使用されるが、プリコンパイル済みヘッダーの静的ライブラリにはないヘッダーをコードに追加することで、同様のことを実現できます。少なくとも一度だけコンパイルされます。

プロジェクト全体で複数のコンパイルタイプがある場合(Obj-C、Obj-C++、C++など)に問題が発生しないように注意する必要があります。

2
Tetrad

こんにちは、プロジェクトの物理構造を最適化することをお勧めします。これについては(少なくともC++の世界では)良い読み物がありますが、私はObjective-Cを使用しており、同じ原則がしばしば適用されます。

これは、コンパイル時間を改善する傾向があるプロジェクトの物理構造最適化に関する素晴らしい記事です Games From Within:Physical Structure Part 1

幸運を :)

2
Goles

1つの単語:TmpDisk

  1. TmpDiskを使用して1.5Gb RAMディスクを作成します
  2. Xcode>環境設定>場所>派生データを/Volumes/1.5Gb/xcode dataに変更します
  3. スピードをお楽しみください!

実行するたびにプロジェクト全体が再構築される場合、それはおそらくXCode 7.0 <= 8.1のバグであり、苦労しています。

ユーザー定義のビルド設定HEADERMAP_USES_VFSをYESに作成すると、macbookのコンパイル時間が毎回75秒から25秒に短縮されます。詳細については、 Xcode 8は完全なプロジェクトの再構築 を参照してください。

1
Thyselius

「より多くのハードウェアを投入する」アプローチに関するクイックノート.

要約:重要なハードウェアのアップグレードを行うと、速度がわずかに向上しました。

テスト:クローンしたMacbookでまったく同じプロジェクトをビルド/実行します(違いはハードウェアのみです)

古いMacbook Air(1.86GHZ Core 2 Duoのみ2GB RAM)と真新しいMacbook Pro(2.3GHZ Core i7 8GB RAM)

IPHONE 3GSの構築
Macbook Air 1:00-1:15
Macbook Pro〜1:00

=> 0〜0:15の速度増加

IPHONE 4Sの構築
Macbook Pro〜0:35
Macbook Air〜0:50

=>〜15秒の速度増加

**部分的にテスト済み:2台のマシン間のSIMULATORのビルド時間に大きな違いがあるようです。


。制限要因は電話のハードウェアでした(コンピューターのハードウェアではありません)。

SO ..最速のビルド時間を得るために..
option1)コードを記述し、高速コンピューターのシミュレーターで実行するOR
オプション2)最新のiPhoneを搭載したデバイスでビルドする

1
user353877