次のコード セグメントは、初回実行時に時間がかかり (5 秒)、連続して実行すると時間が短くなります (250 ミリ秒)。gcc を実行するより良い方法はありますか。
int pid,status;
char * argv[] = {"gcc","program.c",NULL};
if(!(pid=fork())){
execvp("gcc",argv);
}
while(pid!=wait(&status)){
//do nothing
}
まあ、そうは思いません。最初の 5 秒は、おそらくディスクからメモリまですべてを読み取る時間です。コンパイラ自体、コンパイルするソース、インクルードするヘッダー、リンクするライブラリなど。ディスク全体に散らばっているため、ディスクヘッドは多くのシークを行う必要があります。それは遅いです。
その後、すべてのデータが RAM にキャッシュされ、解析とコンパイルが行われ、ディスク IO バウンドではなく CPU バウンドになる可能性があります。
異なる Unix バージョンで実行できる方法は他にありません。別のプロセスを実行するには、fork-exec を使用する必要があります。まさにそのために作成されたものです。
呼び出すことができる関数は他にもありますが ( std::system
1 つ)、それらは通常、 および として実装されfork
ますexec
。