3

私は、Cソースファイルの完全な前処理されたソースコード(#line情報やコメントは必要ありません。生のソースコードのみ)を取得するための最速の方法を見つけようとしています。

Windowsヘッダーファイル(mini.c)を含む次の小さなテストプログラムがあります。

#include <windows.h>

次に、Microsoft Visual Studio 2005を使用して、次のコマンドを実行します。

cl /nologo /P mini.c

これは、2.5MBのmini.iファイルを生成するのに6秒かかります。これをに変更します

cl /nologo /EP mini.c > mini.i

(コメントと#line情報をスキップします)2.1MBの出力を書き込むのにわずか0.5秒かかります。

プリコンパイル済みヘッダーを使用せずに、これをさらに改善するための優れたテクニックを知っている人はいますか?

私が尋ねている理由は、MSVC用の人気のあるccacheツールのバリアントを作成したためです。作業の一環として、プログラムは前処理されたソースコード(およびその他のいくつか)のハッシュサムを計算する必要があります。これをできるだけ速くしたいと思います。

たぶん、利用可能な専用のプリプロセッサバイナリ、または役立つかもしれない他のコマンドラインスイッチがありますか?

更新:頭に浮かんだアイデアの1つは、WIN32_LEAN_AND_MEANマクロを定義して、めったに必要とされない多くのコードを取り除くことです。これにより、上記のプリプロセッサの実行速度が約3倍になります。

4

3 に答える 3

1

同じソースファイル(<windows.h>)を繰り返し処理しているため、他の多くのファイルが取り込まれます。これ<windows.h>は、デフォルトのSDKディレクトリにあります。

現在、この不変のファイルの処理にはかなりの時間がかかります。それでも、変更されないことを信頼できます。結局のところ、これはパブリックインターフェイスの一部です。したがって、前処理して(たとえば、コメントを削除して)、そのバージョンをに渡すことができますcl /EP

もちろん、これは通常I / Oバウンドのタスクですが、重要なCPU部分が混在しています。複数のソースを並行して処理するアプローチは、総スループットに役立ちます。単一ソースの前処理時間を測定することはあまり重要ではありません。

最後に、出力をに書き込む時間を測定しNULます。mini.i出力をにパイプすることを意図しているので、ディスクへの書き込みに必要な時間を含めないでくださいmd5sum

于 2010-12-21T16:05:07.103 に答える
-1

使用できるプロジェクト設定をファイルするための前処理があります。さらに、一部の新しいMSVCバージョンは、マルチスレッドコンパイルを提供します。

于 2010-12-21T15:26:54.683 に答える
-2

/ Pオプションは何年も前から存在しており、.iファイルを作成し、オブジェクトファイルは作成しません。

于 2010-12-21T15:48:07.033 に答える