2009-06-26 14 views
0

次のコードセグメントは、最初に実行されたときにはより多くの時間(5秒)がかかり、連続した実行では時間がかかりません(250ms)。 gccを実行するための良い方法はありますか?fork()とexecvp( "gcc program.c")のどちらの方が良いでしょうか?

int pid,status; 
char * argv[] = {"gcc","program.c",NULL}; 
if(!(pid=fork())){ 
    execvp("gcc",argv); 
} 
while(pid!=wait(&status)){ 
    //do nothing 
} 
+2

確かに、より良い方法があります。 execlpを使用すると、別の配列は必要ありません。 :-) –

答えて

1

さまざまなUnixバージョンで実行できる他の方法はありません。別のプロセスを実行するには、fork-execを使用する必要があります。

+0

posix_spawn:https://www.opengroup.org/onlinepubs/9699919799/functions/posix_spawn.html:-P –

3

まあ、私はそうは思わない。最初の5秒は、おそらくディスクからメモリにすべてを読み取る時間です。コンパイラ自体、コンパイルするソース、インクルードするヘッダ、リンクするライブラリなど。ディスク全体に分散されているため、ディスクヘッドは多くを求めなければなりません。それは遅いです。

すべてのデータがRAMにキャッシュされていると、解析とコンパイルだけであり、おそらくディスクIOバインディングではなくCPU boudnになります。

+0

GCCが必要とするすべてのデータをRAMにキャッシュしておく方法はありますか?システム内の他のプロセスの重さはどれくらいですか? –

+0

問題が発生したらハードウェアを投げてください。より高速なディスク。より多くのRAM。開発者は良いツールが必要です。 低レベルのI/Oスケジューリングを調整できます。それはシステム固有のものなので、あなたが使っているどのOSでもそれをどうやってやるのか分かりません。 –

+0

私はCentOSを使用しています。 –

0

呼び出すことができる他の機能(std::systemは1つです)がありますが、一般的にはforkexecとして実装されます。