GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erstelle ich einen hochauflösenden Timer in Linux, um die Programmleistung zu messen?

Schauen Sie sich clock_gettime an , die eine POSIX-Schnittstelle zu hochauflösenden Timern ist.

Falls Sie sich nach dem Lesen der Manpage über den Unterschied zwischen CLOCK_REALTIME wundern und CLOCK_MONOTONIC , siehe Unterschied zwischen CLOCK_REALTIME und CLOCK_MONOTONIC?

Auf der folgenden Seite finden Sie ein vollständiges Beispiel:http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/

#include <iostream>
#include <time.h>
using namespace std;

timespec diff(timespec start, timespec end);

int main()
{
    timespec time1, time2;
    int temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    for (int i = 0; i< 242000000; i++)
        temp+=temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
    cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
    return 0;
}

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;
}

Um die bisher vorgestellten Informationen zusammenzufassen, sind dies die beiden Funktionen, die für typische Anwendungen erforderlich sind.

#include <time.h>

// call this function to start a nanosecond-resolution timer
struct timespec timer_start(){
    struct timespec start_time;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time);
    return start_time;
}

// call this function to end a timer, returning nanoseconds elapsed as a long
long timer_end(struct timespec start_time){
    struct timespec end_time;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_time);
    long diffInNanos = (end_time.tv_sec - start_time.tv_sec) * (long)1e9 + (end_time.tv_nsec - start_time.tv_nsec);
    return diffInNanos;
}

Hier ist ein Beispiel dafür, wie man sie beim Timing verwendet, wie lange es dauert, die Varianz einer Eingabeliste zu berechnen.

struct timespec vartime = timer_start();  // begin a timer called 'vartime'
double variance = var(input, MAXLEN);  // perform the task we want to time
long time_elapsed_nanos = timer_end(vartime);
printf("Variance = %f, Time taken (nanoseconds): %ld\n", variance, time_elapsed_nanos);

Linux
  1. So messen Sie die Leistung Ihres Linux-VPS-Servers

  2. So erstellen Sie ein Skript eines Linux-Befehls

  3. So erstellen Sie einen Swap unter Linux

  4. So erstellen Sie Linux-Proc-Dateien im C-Programm mit LKM

  5. So erstellen Sie Threads in Linux (mit einem C-Beispielprogramm)

So erstellen Sie Verknüpfungen auf dem Linux-Desktop

So verbessern Sie die Leistung des Laptop-Akkus unter Linux

So erstellen Sie eine Montage aus Bildern unter Linux

So erstellen Sie einen SSH-Alias ​​unter Linux

So erstellen Sie einen Alias ​​unter Linux

So erstellen Sie eine SSH-Schlüssel-Passphrase unter Linux