CPU Zeit messen (Linux - gcc)



  • Hi,
    ich programme unter linux mit gcc (version 4.3.2).
    Ich möchte in meinem Programm gerne die CPU-Zeit messen.

    Kann mir da jemand weiterhelfen, ich finde immer nur gettimeofday, also die wirklich vergangene zeit...

    danke! Sebi



  • Wie wär's mit clock()?


  • Mod

    http://www.opengroup.org/onlinepubs/000095399/basedefs/sys/times.h.html

    Falls du übrigens vor hast zu messen, welche Stellen in deinem Programm langsam sind: GCC kommt schon mit einem guten Profiler (gprof).



  • muss ich dann User CPU time oder System CPU time nehmen?

    Was genau ist mit time of terminated child processes...? Was genau bedeutet das?

    THANKS! Sebi


  • Mod

    Sebi++ schrieb:

    muss ich dann User CPU time oder System CPU time nehmen?

    Was genau ist mit time of terminated child processes...? Was genau bedeutet das?

    THANKS! Sebi

    Naja, wenn du schon sowas messen willst, hätte ich ja eigentlich erwartet, dass du auch weißt, worum es sich überhaupt handelt:
    - Usertime ist die Zeit die verwendet wird für den user-Teil deines Programms, das heißt alle Zeit, die nicht Systemtime ist
    - Systemtime ist die Zeit, die Betriebssystemaufrufe durch dein Programm benötigen

    Bei den meisten Programmen ist usertime >> systemtime.

    Und ein child Prozess ist einfach ein weiterer Prozess (also in der Regel ein weiteres Programm), der von deinem Programm aus aufgerufen wurde. Das ist auch eine wichtige Kenngröße, wenn du dein Programm mittels mehrerer Prozesse parallelisierst. Die time-Funktion kann aber nur die verbrauchte CPU-Zeit von Kindprozessen messen, wenn diese schon beendet wurden, das bedeutet das terminated. Wenn du mal mit dem Konsolenbefehl pstree ein bisschen rumspielst, sollte dir klar werden, was gemeint ist.

    Wenn dein Programm keine Subprozesse aufruft, ist die Zeit für die Kindprozesse logischerweise 0.

    Die Gesamt-CPU Zeit ist die Summe aus allen 4 Zeiten.



  • Super, vielen vielen Dank für deine Erklärung!!
    Also würde sowas klappen:

    #include <time.h>
    
         clock_t start, end;
         double cpu_time_used;
    
         start = clock();
         ... /* Do the work. */
         end = clock();
         cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    

  • Mod

    Sebi++ schrieb:

    Also würde sowas klappen:
    [...]

    Ja, aber clock() ist in der Regel ziemlich schlecht aufgelöst. Wenn du bessere Zeitauflösung haben willst, musst du die von mir genannten Betriebssystemfunktionen verwenden. Außerdem heißt der Header in C++ nicht time.h sondern ctime.

    Ich bin mir auch nicht 100% sicher, ob clock wirklich CPU-Zeit misst und nicht Echtzeit. Die Beschreibung ist ein bisschen vage.





  • Ist getrusage auch interessant wenn ich nicht mehrere Prozesse parallelisiert habe. Also einfach nur ein "normales" Programm habe?

    Sorry ich habe es noch nicht ganz verstanden. Auf wenn Websiten wird ja von mehreren Prozessen gesprochen (soweit ich es verstanden habe).



  • 1. Du koenntest einfach einen Profiler benutzen (gprof wurde schon erwaehnt), geht am einfachsten. Valgrind ist auch ein sehr sehr toller Profiler, mit KCachegrind gibts auch eine Super GUI dazu, die dir genau sagt, welcher Teil des Programms wieviel Zeit kostet.
    2. Kennst du das Programm time ? Wenn du die Laufzeit des ganzen Programmes wissen willst, dann ruf dein Programm doch einfach mal so in der Shell auf:

    time [i]myprogram[/i]
    

    🙂



  • Fuer gewoechnlich ist time ein built-in der bash. Das echte time findet man unter /bin/time (oder so) und gibt wesentlich mehr Informationen preis.



  • hmmm, ich möchte ja garnicht die Zeit meiner einzelnen Programmabschnitte haben, also kein profiling...

    Nur die CPU-zeit meines Programmes..
    jetzt war die frage ob ich mit

    #include <time.h>
    
    clock_t start, end;
    double cpu_time_used;
    
    start = clock();
    ... /* Do the work. */
    end = clock();
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    

    weiterkomme, oder mit dem neuen Vorschlag: getrusage.

    Sowas wie

    double getcputime(void){     
       struct timeval tim;        
       struct rusage ru;        
       getrusage(RUSAGE_SELF, &ru);        
       tim=ru.ru_utime;        
       double t=(double)tim.tv_sec + (double)tim.tv_usec / 1000000.0;        
       tim=ru.ru_stime;        
       t+=(double)tim.tv_sec + (double)tim.tv_usec / 1000000.0;        
       return t; 
    }
    

    von: http://rabbit.eng.miami.edu/info/functions/time.html#getrusage

    This example function returns the total CPU time consumed by the current
    process, measured in seconds, as a double precision floating point number.
    It adds together the user time and the system time.

    Klingt ja eigentlich gut... hat einer damit Erfahrung. Gibts einen Unterschied zu clock()?
    Also beschreibe ich mit RUSAGE_SELF das ich nur den aktuellen Prozess messen will, das müßte dann auch klappen wenn ich KEINE child-prozesse habe, oder?



  • getrusage() klingt glaub ich gut!

    Noch eine Frage.. wie genau messe ich jetzt?
    Mach ich dann sowas

    int main(){
      double time;
      time = getcputime();
      // programm
      time = getcputime() - time;
    }
    

    Hmmm.. stimmt das so?
    Oder wie sage ich ihm sonst welchen Prozess ich meine..



  • Sebi++ schrieb:

    hmmm, ich möchte ja garnicht die Zeit meiner einzelnen Programmabschnitte haben, also kein profiling...

    Nur die CPU-zeit meines Programmes..

    Dann nimm den time -Befehl in deiner Shell und gut ist.


Anmelden zum Antworten