Pomiar czasu wykonania funkcji w nanosekundach

0

Witam,
mam małe pytanie, czy ten kod jest poprawny i poprawnie pokazuje czas wykonania funkcji pod linuxem, bo cały czas dostaję 0ns?
Chodzi mi o czas z dokładnością do nanosekund. Jeśli jest zły to co wykorzystać zamiast jego?
kompilacja z -lrt

#include <iostream>
#include <ctime>

using namespace std;

long long silnia(long long n) {
    if(n == 0) return 1;
    else return n * silnia(n - 1);    
}

// main function
int main() {
    struct timespec ts1, ts2;

    int n = 0;
    cout << " silnia dla jakiej liczby: ";
    cin >> n;
    long long wynik = 1;

    // rozdzielczosc zegara 
    clock_getres(CLOCK_REALTIME, &ts1);
    cout << "rozdzielczosc zegara RPi: " << ts1.tv_nsec << " ns " << endl;
    
    clock_gettime(CLOCK_REALTIME, &ts1); // start
    for(int i = n; i > 0; --i) {
        wynik *= i;    
    }
    clock_gettime(CLOCK_REALTIME, &ts2); // stop

    cout << "silnia iteracyjna: " << (ts2.tv_nsec - ts1.tv_nsec) / 1000000 << "ns" << endl;
    cout << wynik << endl;

    clock_gettime(CLOCK_REALTIME, &ts1); // start
    wynik = silnia(n);
    clock_gettime(CLOCK_REALTIME, &ts2); // stop

    cout << "silnia rekurencyjna: " << (ts2.tv_nsec - ts1.tv_nsec) / 1000000 << "ns" << endl;
    cout << wynik << endl;

    return 0;
} 

dzięki za pomoc

1

https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_MRG/2/html/Realtime_Reference_Guide/Realtime_Reference_Guide-Timestamping-Clock_Resolution.html


teraz widzę, że pobierasz clock resolution. co ci drukuje ta linijka? ```cpp cout < "rozdzielczosc zegara RPi: " < ts1.tv_nsec < " ns " < endl; ``` zapewne coś w okolicach 1000000 tak jak w linku i tu jest cały problem.

Radze popatrzeć jeszcze na to: http://stackoverflow.com/questions/538609/high-resolution-timer-with-c-and-linux
Może znajdziesz alternatywne rozwiązanie.


Gdy testuje się za szybką funkcję (powinieneś mieć to napisane jako funkcję), to wtedy wywołuje się ja 1000 razy by załapać się na rozdzielczość czasową zegara.
0

Ta linijka daje mi 1ns.
Następne linijki dają mi po 0ns i właśnie przez to, zastanawiam się czy wszystko z tym jest ok.


Problem rozwiązałem, dzięki za pokierowanie gdzie szukać rozwiązania, teraz wszystko działa tak jak chciałem :)
Rozwiązanie znalazłem tutaj: http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/

 
#include <iostream>
#include <ctime>

using namespace std;

long long silnia_rekurs(long long n) {
    if(n == 0) return 1;
    else return n * silnia_rekurs(n - 1);    
}

long long silnia_iter(int n) {
    if(n == 0) return 1;
    long long wynik = 1;
    for(int i = n; i > 0; --i) 
        wynik *= i;
        
    return wynik;    
}

// difference time
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;
} // diff

// main function
int main() {
    // struktury wykorzystywane do czasu
    struct timespec time1, time2;

    int n = 0;
    cout << " silnia dla jakiej liczby: ";
    cin >> n;
    long long wynik = 1;

    // rozdzielczosc zegara 
    clock_getres(CLOCK_PROCESS_CPUTIME_ID, &time1);
    cout << "rozdzielczosc zegara RPi: " << time1.tv_nsec << " ns " << endl;
    
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); // start
    wynik = silnia_iter(n);
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); // stop

    cout << "silnia iteracyjna: " << diff(time1, time2).tv_nsec << "ns" << endl;
    cout << wynik << endl;

    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); // start
    wynik = silnia_rekurs(n);
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); // stop

    cout << "silnia rekurencyjna: " << diff(time1, time2).tv_nsec << "ns" << endl;
    cout << wynik << endl;

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1