2009-06-26 6 views
0

Das folgende Codesegment benötigt mehr Zeit (5s), wenn es zum ersten Mal ausgeführt wird und benötigt weniger Zeit (250ms) bei aufeinanderfolgenden Durchläufen. Gibt es eine bessere Möglichkeit, gcc auszuführen?Gibt es eine bessere Alternative zu fork() und dann 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

Sicher, es gibt einen besseren Weg ... stilistisch. Verwenden Sie execlp und Sie werden das separate Array nicht benötigen. :-) –

Antwort

1

Es gibt keine andere Möglichkeit, dies zu tun, die über verschiedene Unix-Versionen laufen würde. Um einen separaten Prozess auszuführen, müssen Sie fork-exec verwenden - genau dafür sind sie gemacht.

+0

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

3

Nun, ich denke nicht. 5 Sekunden auf den ersten gehen ist wahrscheinlich Zeit, alles von der Festplatte in den Speicher zu lesen. Der Compiler selbst, die zu kompilierenden Quellen, die einzubeziehenden Header, Bibliotheken zum Verknüpfen usw. Es ist auf der ganzen Platte verstreut, also müssen die Plattenköpfe viel suchen. Das ist langsam.

Danach haben Sie alle Daten im RAM zwischengespeichert, es ist nur Parsing und Kompilierung und wird wahrscheinlich CPU Boudn statt I/O gebunden.

+0

Gibt es irgendeine Möglichkeit, dass ich alle Daten, die von GCC im RAM zwischengespeichert werden, immer brauchen, egal Wie schwer sind die anderen Prozesse im System? –

+0

Werfen Sie Hardware auf das Problem. Schnellere Festplatte Mehr Arbeitsspeicher Entwickler brauchen gute Werkzeuge. Sie können die I/O-Planung auf niedriger Ebene optimieren. Das ist systemspezifisch und ich habe keine Ahnung, wie ich es unter welchem ​​Betriebssystem auch immer machen soll. –

+0

Ich benutze CentOS. –

0

Es gibt andere Funktionen, die Sie anrufen können (std::system ist eine), aber sie werden im Allgemeinen als fork und exec implementiert.

Verwandte Themen