Ausführungszeit messen

Aug. 16, 2012·
Julio Batista Silva
Julio Batista Silva
· 2 Min Lesezeit
blog

In ZSH:

julio@acer ~> time ./programm
  Hello World!
  ./programm  1.54s user 0.03s system 97% cpu 1.611 total
julio@acer ~> type -a time
  time is a reserved word
julio@acer ~> which time
  time: shell reserved word
julio@acer ~> sudo pacman -S time
julio@acer ~> /usr/bin/time ./programm
  Hello World!
  1.39user 0.00system 0:01.41elapsed 99%CPU (0avgtext+0avgdata 8940maxresident)k
  0inputs+0outputs (0major+758minor)pagefaults 0swaps
julio@acer ~> /usr/bin/time -v ./programm
  Hello World!
      Command being timed: "./programm"
      User time (seconds): 1.57
      System time (seconds): 0.05
      Percent of CPU this job got: 99%
      Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.63
      Average shared text size (kbytes): 0
      Average unshared data size (kbytes): 0
      Average stack size (kbytes): 0
      Average total size (kbytes): 0
      Maximum resident set size (kbytes): 8936
      Average resident set size (kbytes): 0
      Major (requiring I/O) page faults: 0
      Minor (reclaiming a frame) page faults: 758
      Voluntary context switches: 1
      Involuntary context switches: 181
      Swaps: 0
      File system inputs: 0
      File system outputs: 3160
      Socket messages sent: 0
      Socket messages received: 0
      Signals delivered: 0
      Page size (bytes): 4096
      Exit status: 0
julio@acer ~> /usr/bin/time -p ./programm
Hello World!
real 1.45
user 1.44
sys 0.00

alias time='/usr/bin/time -p'

C/C++

Die Genauigkeit von time und /usr/bin/time reicht nicht aus, wenn du ernsthaftes Profiling betreiben oder die Zeit eines bestimmten Codeabschnitts statt des ganzen Programms messen willst. Dafür können wir unter Linux und FreeBSD die Funktion clock_gettime aus time.h benutzen.

Ein Blick in /usr/include/time.h: int clock_gettime(clockid_t clk_id, struct timespec *tp);

CLOCK_REALTIME: Systemuhr. CLOCK_MONOTONIC: CLOCK_PROCESS_CPUTIME_ID: Timer, den die CPU je Prozess bereitstellt. CLOCK_THREAD_CPUTIME_ID: Timer, den die CPU je Thread bereitstellt.

#include <ctime>

timespec diff(timespec start, timespec end)
{
    timespec temp;
    if (end.tv_nsec - start.tv_nsec < 0)
    {
        temp.tv_sec = end.tv_sec - start.tv_sec-1;
        temp.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec;
    }
    else
    {
        temp.tv_sec = end.tv_sec - start.tv_sec;
        temp.tv_nsec = end.tv_nsec - start.tv_nsec;
    }
    return temp;
}

int main()
{
    timespec time1, time2;
    clock_gettime(CLOCK_REALTIME, &time1);

    // ... ... ...

    clock_gettime(CLOCK_REALTIME, &time2);

    cout << diff(time1,time2).tv_sec << ":"
            << diff(time1,time2).tv_nsec << endl;

    return 0;
}

Dieses Programm muss mit g++ -lrt -o programm programm.cpp kompiliert werden; das Ergebnis sieht etwa so aus:

julio@acer ~> ./programm
  0:7674929
Julio Batista Silva
Autoren
Senior Cloud Developer

Ich bin ein brasilianischer Computeringenieur mit Wohnsitz in Deutschland und begeistere mich für Technik, Wissenschaft, Fotografie und Sprachen.

Ich programmiere seit etwa zwei Jahrzehnten und habe dabei alles von mobilen Apps und Webentwicklung bis hin zu Machine Learning erkundet. Derzeit fokussiere ich mich auf Cloud‑SRE und Data Engineering.

Ich engagiere mich ehrenamtlich in den Open‑Source- und Python‑Communities, helfe bei der Organisation der PyCon DE und PyData Berlin, betreue als Mentor und trage mit Code und Übersetzungen bei.

In meinem Blog teile ich Linux‑Tipps, Einrichtungsanleitungen und persönliche Notizen, die ich als spätere Referenz geschrieben habe. Ich hoffe, dass sie auch anderen nützlich sind. Die Inhalte sind in mehreren Sprachen verfügbar.

Schau dir meine Galerie an, um einige meiner Fotografien zu sehen.

Abseits der Tastatur findest du mich auf Konzerten, beim Klarinettenspiel, Radfahren, Tauchen oder beim Erkunden neuer Orte, Kulturen und Küchen.

Ich freue mich immer über den Austausch! 🙂

comments powered by Disqus