適用先: ARM Developer Suite (ADS)、RealView Development Suite (RVDS)、Tool Licensing (License Management)
最新のアプリケーションは多くの場合、数千個に及ぶソース ファイルで構成されており、コンパイルとリンクにかなりの時間を要することがあります。また、コード サイズの縮小とパフォーマンスの向上を目的として、ARM のコンパイル ツールで各種の最適化技法が採用された結果、ビルド時間が増加しています。本記事では、コードのビルド時間を短縮するためのさまざまな方法について検討します。
コンパイラの呼び出し時に実行される処理について
コンパイラを呼び出すと、次の 3 つのステップが実行されます。
1. コンパイラがロードされ、実行が開始されます。
通常、この処理に要する時間は一定です。
2. コンパイラがライセンスの取得を試みます。
ライセンスが使用可能であると想定すると、この処理に要する時間は各要求の処理に要する時間に相当すると考えられます。ただし、フローティング ライセンスを使用している場合は、ネットワーク トラフィックの状況や、サーバ上でライセンスに空きがあるかどうかによって左右されます。使用できるライセンスが存在しない場合、ADS 1.2 のビルドは失敗するのに対して、RVDS のコンパイル ツールはほとんどの状況でライセンスが使用可能になるのを待機するという点に注意してください。
フローティング ライセンスを取得するプロセスは、ノードロック ライセンスを取得するプロセスよりも複雑です。ノードロック ライセンスを使用する場合は、コンパイラ側では、ファイルを解析して有効なライセンスが存在していることを確認するだけで済みます。
フローティング ライセンスを使用する場合は、コンパイラ側では、ライセンスが存在している場所を確認し、ネットワーク上のサーバに TCP/IP スタックを介してメッセージを送信した上で、応答を待機する必要があります。さらに、応答を受信してから、ライセンスが付与されているかどうかを確認する必要があります。また、コンパイルの完了後には、ライセンスをサーバに返却する必要があります。
フローティング ライセンスによって利便性は向上しますが、処理速度は犠牲になります。処理速度が優先される場合は、ビルド マシン用のノードロック ライセンスを取得する方法か、必要に応じてマシン間で移動できるよう、複数のノードロック ライセンスを USB ネットワーク カードにロックする方法を検討してください。
環境変数
を
に設定すると、クライアントおよびサーバ マシンで、ライセンス要求の処理時に、FLEXlm/FLEXnet ライセンス サーバのシステム パフォーマンスが向上します。ただし、ネットワーク トラフィックが増加する可能性があるので、この設定は注意して使用してください。
フローティング ライセンスの詳細については、
フローティングライセンスサーバからのライセンス取得に関する最適化について
を参照してください。
3. コンパイラがコードをコンパイルします。
このステップに要する時間は、コンパイル対象のファイルの複雑さやサイズに応じて異なります。少量かつ大サイズのファイルをコンパイルする処理の方が、大量かつ小サイズのファイルをコンパイルする処理よりも短時間です。これは、ファイル単位のコンパイラの処理に長い時間を要したとしても、コンパイラのロード / アンロードやライセンスの取得に費やされる時間が短くなり、相殺されるからです。
この処理をさらに応用すると、1 回の
の呼び出し(および 1 回のライセンス チェックアウト)で多数のファイルをコンパイルすることが可能になります。具体的には、次のようにビルド スクリプトを記述している場合
armcc file1.c ....
armcc file2.c ....
armcc file3.c ....
:
:
次のように変更します。
armcc file1.c file2.c file3.c .....
.c ファイルをすべて単一の "via" ファイルにリスト化して、次のように呼び出す方法もあります。
この方法では、ライセンスのチェックアウトとコンパイラのロード / アンロードの回数が著しく削減され、パフォーマンスの大幅な向上を実現できます。ただし、いくつかの制約があります。
・ 全ファイルが同じオプションでコンパイルされる
・ 既存のビルド システムを変換することは困難な場合がある
・ ユーザビリティはソース ファイルの構造と依存関係によって左右される
・ IDE では、どのファイルでコンパイル エラーが発生したのか通知できない場合がある
注 1:
エラーの検出後、RVCT コンパイラでは以降のファイルのコンパイルは実行されません。これに対して、古い ADS コンパイラでは、以降の全ファイルのコンパイルが試行されます。
注 2:
最適化レベル
でコンパイルを実行すると、マルチファイル コンパイルが有効になり、ビルド時間が増加する可能性があります。マルチファイル コンパイルの使用を無効にする場合は
オプションを使用します。
#ifndef foo_h
#define foo_h
:
// rest of header file as before
:
#endif /* foo_h */
この解答はお客様のお役に立てましたでしょうか?