適用先: ARM Developer Suite (ADS)、RealView Development Suite (RVDS)、Tool Licensing (License Management)



最新のアプリケーションは多くの場合、数千個に及ぶソース ファイルで構成されており、コンパイルとリンクにかなりの時間を要することがあります。また、コード サイズの縮小とパフォーマンスの向上を目的として、ARM のコンパイル ツールで各種の最適化技法が採用された結果、ビルド時間が増加しています。本記事では、コードのビルド時間を短縮するためのさまざまな方法について検討します。

コンパイラの呼び出し時に実行される処理について
コンパイラを呼び出すと、次の 3 つのステップが実行されます。

1. コンパイラがロードされ、実行が開始されます。

通常、この処理に要する時間は一定です。


2. コンパイラがライセンスの取得を試みます。

ライセンスが使用可能であると想定すると、この処理に要する時間は各要求の処理に要する時間に相当すると考えられます。ただし、フローティング ライセンスを使用している場合は、ネットワーク トラフィックの状況や、サーバ上でライセンスに空きがあるかどうかによって左右されます。使用できるライセンスが存在しない場合、ADS 1.2 のビルドは失敗するのに対して、RVDS のコンパイル ツールはほとんどの状況でライセンスが使用可能になるのを待機するという点に注意してください。
フローティング ライセンスを取得するプロセスは、ノードロック ライセンスを取得するプロセスよりも複雑です。ノードロック ライセンスを使用する場合は、コンパイラ側では、ファイルを解析して有効なライセンスが存在していることを確認するだけで済みます。
フローティング ライセンスを使用する場合は、コンパイラ側では、ライセンスが存在している場所を確認し、ネットワーク上のサーバに TCP/IP スタックを介してメッセージを送信した上で、応答を待機する必要があります。さらに、応答を受信してから、ライセンスが付与されているかどうかを確認する必要があります。また、コンパイルの完了後には、ライセンスをサーバに返却する必要があります。
フローティング ライセンスによって利便性は向上しますが、処理速度は犠牲になります。処理速度が優先される場合は、ビルド マシン用のノードロック ライセンスを取得する方法か、必要に応じてマシン間で移動できるよう、複数のノードロック ライセンスを USB ネットワーク カードにロックする方法を検討してください。
環境変数 TCP_NODELAY 1 に設定すると、クライアントおよびサーバ マシンで、ライセンス要求の処理時に、FLEXlm/FLEXnet ライセンス サーバのシステム パフォーマンスが向上します。ただし、ネットワーク トラフィックが増加する可能性があるので、この設定は注意して使用してください。
フローティング ライセンスの詳細については、 フローティングライセンスサーバからのライセンス取得に関する最適化について を参照してください。


3. コンパイラがコードをコンパイルします。

このステップに要する時間は、コンパイル対象のファイルの複雑さやサイズに応じて異なります。少量かつ大サイズのファイルをコンパイルする処理の方が、大量かつ小サイズのファイルをコンパイルする処理よりも短時間です。これは、ファイル単位のコンパイラの処理に長い時間を要したとしても、コンパイラのロード / アンロードやライセンスの取得に費やされる時間が短くなり、相殺されるからです。
この処理をさらに応用すると、1 回の armcc の呼び出し(および 1 回のライセンス チェックアウト)で多数のファイルをコンパイルすることが可能になります。具体的には、次のようにビルド スクリプトを記述している場合
armcc file1.c ....
armcc file2.c ....
armcc file3.c ....
:
:

次のように変更します。
armcc file1.c file2.c file3.c .....
.c ファイルをすべて単一の "via" ファイルにリスト化して、次のように呼び出す方法もあります。
armcc -via sources.txt
この方法では、ライセンスのチェックアウトとコンパイラのロード / アンロードの回数が著しく削減され、パフォーマンスの大幅な向上を実現できます。ただし、いくつかの制約があります。

・ 全ファイルが同じオプションでコンパイルされる

・ 既存のビルド システムを変換することは困難な場合がある

・ ユーザビリティはソース ファイルの構造と依存関係によって左右される

・ IDE では、どのファイルでコンパイル エラーが発生したのか通知できない場合がある


注 1: エラーの検出後、RVCT コンパイラでは以降のファイルのコンパイルは実行されません。これに対して、古い ADS コンパイラでは、以降の全ファイルのコンパイルが試行されます。

注 2: 最適化レベル -O3 でコンパイルを実行すると、マルチファイル コンパイルが有効になり、ビルド時間が増加する可能性があります。マルチファイル コンパイルの使用を無効にする場合は 、--no_multifile オプションを使用します。



インクルード パスの効果
インクルード パスもビルド時間が増加する原因になることがあります。インクルード パスの数は最小限にとどめてください。多数のインクルード パスを使用する場合、インクルードする必要があるファイルは、インクルード検索パスの開始位置付近のディレクトリに配置してください。
ヘッダを複数回インクルードすることも、コンパイル時間が増加する原因になる場合があるので避けるようにしてください。実際に、ヘッダを複数回インクルードしないよう保護する方法があります。たとえば、ヘッダ ファイル 'foo.h' を使用する場合、次の内容を追加します。


#ifndef foo_h
#define foo_h
:
// rest of header file as before
:
#endif /* foo_h */

コンパイラ オプション -W+g を使用すると、保護されていないヘッダ ファイルを警告できます。


パラレル メイクの使用
makefileベースのビルド環境を使用している場合、パラレル メイク(gnu make などのメイク ツールによって提供される機能)の使用を検討してください。具体的には、一般に " make -j N " を使用します。 N は、並列実行するコンパイル プロセスの数です。シングル プロセッサ構成のマシンを単独で使用している場合でも、上記の方法では、別のコンパイル プロセスで CPU をフルに活用することによって、ネットワークの遅延や一般的な I/O アクセス(ディスクへのファイルのロード / 保存など)に伴う時間をカバーできるので、パフォーマンスの向上を実現できます。
マルチ プロセッサ構成のマシンを使用している場合は、" make -j N*M "( M はプロセッサの数)を使用することで、さらに並列処理を活用できます。
この主題については、次のディスカッションが参考になります。 http://developers.sun.com/solaris/articles/parallel_make.html

オペレーティング システムの選択
一般に、Linux および Solaris 環境は Windows 環境よりもビルド時間が短くなります。
ADS および RVDS をサポートしているプラットフォームの詳細については、 こちら を参照してください。
Windows を使用している場合、(一般的なレベルで)OS のパフォーマンスをチューニングする方法が用意されており、ビルドに使用される CPU 時間の割合を増やすことができます。簡単なレベルでは、ウィルス チェック ソフトウェアをオフにするだけでも効果があります。これ以外にも、「Windows のパフォーマンス チューニング」というフレーズでインターネットを検索すれば、さまざまな情報が得られます。

アンケートにご協力お願いします

この解答はお客様のお役に立てましたでしょうか?

 

           

検索に戻る