2017-07-02 1 views
0

Est-il possible de mesurer le temps d'exécution de std::system(...)?Mesure du temps d'exécution réel de std :: system en C++

Ou peut-être la fonction retourne-t-elle immédiatement et ce n'est pas possible, et dans ce cas existe-t-il un autre moyen de mesurer l'exécution d'un programme forké?

Merci pour toute aide.

+0

Supposons que c'est Linux depuis que vous avez utilisé 'fork'. 'system (" time "YOUR_COMMAND)' est suffisant, bien que la consommation de temps soit imprimée sur le terminal. – Thiner

+0

Si vous souhaitez mesurer le temps d'appel 'system' comme les autres sous-routines, vous pouvez passer à' rdtsc'/'gettimeofday'/... (' time' dans time.h n'est pas recommandé car il ne peut retourner que la seconde en cours, et n'est pas utile) – Thiner

Répondre

3

Sauf si vous êtes à la recherche d'un système qui est ni Posix avec une coquille de poisson comme ni de Windows, std::system est synchrone et renvoie le résultat de la commander. Vous pouvez utiliser le high resolution timer standard pour mesurer le temps de mur:

#include <chrono> 
#include <cstdlib> 
#include <iostream> 

int main() 
{ 
    auto before = std::chrono::high_resolution_clock::now(); 
    std::system("sleep 3"); 
    auto after = std::chrono::high_resolution_clock::now(); 

    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
     after - before); 

    std::cout << "It took " << duration.count() << " microseconds\n"; 
} 

Si vous êtes plutôt intéressé par la quantité de temps CPU que le processus utilisé, je ne pense pas que C++ a une manière standard et multi-plateforme de vous offrir cela. `System` consiste à exécuter une commande.

+0

Merci d'avoir répondu. Mon problème était en fait que 'std :: system' s'exécutait trop rapidement. Donc, maintenant je peux mesurer exactement à quelle vitesse :) – CpCd0y

1

Il est spécifique à l'implémentation (puisque, AFAIU, la norme C++ ne dit pas grand-chose sur le processeur de commande utilisé par std::system, ce processeur de commande peut même ne pas exécuter de processus externes).

Mais concentrons sur Linux (ou au moins sur d'autres systèmes POSIX). Ensuite, vous pouvez utiliser les appels système de niveau inférieur fork(2), execve(2), wait4(2) et utiliser le struct rusage (voir getrusage(2) pour plus de détails) rempli par cet appel réussi wait4, notamment pour obtenir le temps CPU. Si vous voulez juste le temps écoulé réel temps, utilisez <chrono> C++ facilities (ou niveau inférieur time(7) choses telles que clock_gettime(2) ...)

Notez que la fonction standard C clock donne des informations sur temps processeur (dans le courantprocess) ne mesurera donc pas ce qu'un processus enfant forké (par std::system) consommerait.

2

Essayez ce code (pour Linux & Posix),

#include<time.h> 
#include<sys/types.h> 
#include<sys/wait.h> 
#include <iostream> 
#include <cstdlib> 
struct tms st_time; 
struct tms ed_time; 
int main() 
{ 
    times(&st_time); 
    std::system("your call"); 
    times(&ed_time); 
    std::cout<<"Total child process time =" 
      <<((ed_time.tms_cutime - st_time.tms_cutime) 
       +(ed_time.tms_cstime - st_time.tms_cstime))/CLOCKS_PER_SEC; 
} 
+0

Ne fonctionnera pas. Sur les systèmes POSIX 'clock()' -see [clock (3)] (http://man7.org/linux/man-pages/man3/clock.3.html) ...- donne une approximation du processus en cours Temps CPU (à l'exclusion des processus enfants). Windows est connu pour être défectueux parce que son horloge donne une approximation approximative du temps réel écoulé –

+0

BTW, votre code est C, et l'OP demande à propos de C++ –

+0

Même avec l'édition cette réponse est fausse –