Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[c] program do odmierzania czasu w linux

bycio 27 Wrz 2010 22:04 1965 5
  • #1 27 Wrz 2010 22:04
    bycio
    Poziom 9  

    Witam szanowne grono forumowiczów:) Chciałbym stworzyć program który zlicza czas w systemie linux. Chodziłoby o coś takiego co by zliczało go jakimiś 2 funkcjami.. Powiedzmy sleep() zestawić z jakąś podstawową funkcją mierzącą czas, żeby sprawdzić dokładność obu funkcji.. znalazłem coś takiego...

    Code:
    #include <linux/signal.h>
    
    #include <linux/sched.h>
    #include <linux/string.h>
    #include <linux/errno.h>
    #include <linux/time.h>
    #include <linux/mm.h>

    #include <asm/segment.h>



    static unsigned long tvtojiffies(struct timeval *value)
    {
        unsigned long sec = (unsigned) value->tv_sec;
        unsigned long usec = (unsigned) value->tv_usec;

        if (sec > (ULONG_MAX / HZ))
            return ULONG_MAX;
        usec += 1000000 / HZ - 1;
        usec /= 1000000 / HZ;
        return HZ*sec+usec;
    }

    static void jiffiestotv(unsigned long jiffies, struct timeval *value)
    {
        value->tv_usec = (jiffies % HZ) * (1000000 / HZ);
        value->tv_sec = jiffies / HZ;
        return;
    }

    _getitimter(rodzaj zegara, bufor)
    sys_getitimter(rodzaj zegara, bufor)

    /*Funkcja zwraca ustawienia danego zegara.
    /
    static int _getitimer(int which, struct itimerval *value)
    {
        register unsigned long val, interval;

        switch (which) {
        case ITIMER_REAL:
            interval = current->it_real_incr;
            val = 0;


            if (del_timer(&current->real_timer)) {
                unsigned long now = jiffies;
                val = current->real_timer.expires;
                add_timer(&current->real_timer);
                /* look out for negative/zero itimer.. */
                if (val <= now)
                    val = now+1;
                val -= now;
            }
            break;
        case ITIMER_VIRTUAL:
            val = current->it_virt_value;
            interval = current->it_virt_incr;
            break;
        case ITIMER_PROF:
            val = current->it_prof_value;
            interval = current->it_prof_incr;
            break;
        default:
            return(-EINVAL);
        }

    /*Przelicz "jiffies" na sekundy/mikrosekundy.
    /
        jiffiestotv(val, &value->it_value);
        jiffiestotv(interval, &value->it_interval);
        return 0;
    }


    asmlinkage int sys_getitimer(int which, struct itimerval *value)
    {
        int error;
        struct itimerval get_buffer;

        if (!value)
            return -EFAULT;
        error = _getitimer(which, &get_buffer);
        if (error)
            return error;
        error = verify_area(VERIFY_WRITE, value, sizeof(struct itimerval));
        if (error)
            return error;
        memcpy_tofs(value, &get_buffer, sizeof(get_buffer));
        return 0;
    }


    czy ten kod by sie nadawał na baze takiego programu? Do tego na pewno trzebaby dołożyć funkcje drugą i jakieś wyświetlanie czasów.. pomoże ktoś bo jestem niestety żółtodziób w kwestii programowania..

    0 5
  • #2 28 Wrz 2010 06:32
    lukagrom
    Poziom 15  

    Nie wiem czy dobrze zrozumiałem o jaki czas chodzi, jeśli ten od uruchomienia systemu to
    wystarczy komenda -

    Code:
    cat /proc/uptime
    . Budowany program właśnie powinien odwoływać się do tego pliku - uptime, który zawiera wartości sekundowe wyrażone w wartościach zmiennoprzecinkowych, oczywiście wszystko ładnie można poprzekształcać .
    Drugą drogą oferującą większe mozliwośći jest wykorzystanie wywołania - setitimer. Zdaje sie biblioteka -
    Code:
    sys/time.h>
    i struktura itimerval. Powodzenia.

    0
  • #3 28 Wrz 2010 09:44
    beluosus
    Poziom 25  

    bycio napisał:
    Chodziłoby o coś takiego co by zliczało go jakimiś 2 funkcjami.. Powiedzmy sleep() zestawić z jakąś podstawową funkcją mierzącą czas, żeby sprawdzić dokładność obu funkcji..

    Nie bardzo rozumiem o co Ci chodzi, zwłaszcza z tym sleepem. Wrzucę klasę w cpp, z której korzystam kiedy potrzebuję zmierzyć ile coś się wykonuje:
    Code:
    #ifndef _MTIME_H
    
    #define _MTIME_H

    #include <sys/time.h>

    class MTime
    {
    public:
        void start();
        void stop();
        double getDiff();
    private:
        struct timeval _tstart, _tend;
        struct timezone tz;
    };

    #endif  /* _MTIME_H */


    Code:
    #include "MTime.h"
    

    void MTime::start()
    {
        gettimeofday(&_tstart, &tz);
    }

    void MTime::stop()
    {
        gettimeofday(&_tend, &tz);
    }

    double MTime::getDiff()
    {
        #define DBL static_cast<double>
        double t1 =  DBL(_tstart.tv_sec) + DBL(_tstart.tv_usec) / 1000000;
        double t2 =  DBL(_tend.tv_sec) + DBL(_tend.tv_usec) / 1000000;
        #undef DBL
        return t2 - t1;
    }


    I przykład wykorzystania:
    Code:
        MTime stoper;
    

        stoper.start();
        sleep(1);
        stoper.stop();

        cout << setprecision(6) << fixed << stoper.getDiff() << endl; // 6 - jedna milionowa sekundy (us)

    0
  • #4 28 Wrz 2010 17:40
    bycio
    Poziom 9  

    hmmm... chodzi o to zeby porownac dzialanie i dokladnosc 2-uch funkcji czasowych.. powiedzmy funkcja sleep() i funkcja jitters ... chodzi o taki programik ktory uruchamia mierzenie czasu obiema funkcjami wyswietlenie go w celu sprawdzenia ktora dziala dokladniej.. i tyle.. zadnych wodotryskow ;) prosty przykladowy program do pokazania dokladnosci funkcji;)

    0
  • #5 05 Paź 2010 16:40
    bycio
    Poziom 9  

    witam. zaproponowany programik do sprawdzenia ile czasu dziala jakis proces moglby byc jakas baza do tego co potrzebuje.. czy bylaby mozliwosc zrobienia takiego czegos:
    powiedzmy ze ten program liczy czas wykonania czynnosci i podaje w mikrosekundach.. wiec...
    robimy start puszczamy funkcje sleep(10) i stop
    pokazuje nam ze czas jaki minal to 10 sekund czyli 10 000 000 mikro
    i pozniej robimy to samo ale zamiast sleep() wpisujemy usleep(9800)
    i powinno pokazac ze ta funkcja jest bardziej dokladna bo 9800000 mikro.. czy daloby rade w prosty sposob zobrazowac to za pomoca kodu?

    0
  • #6 07 Paź 2010 12:02
    Radkoo
    Poziom 11  

    Code:

    #include<stdio.h>
    #include<time.h>


    typedef struct timeval {
      long tv_sec;
      long tv_usec;
    } timeval;

    int main(void){

    timeval tim;
                 gettimeofday(&tim, NULL);
                 double t1=tim.tv_sec*1000000+tim.tv_usec;
                 sleep(1);
                 gettimeofday(&tim, NULL);
                 double t2=tim.tv_sec*1000000+tim.tv_usec;
                 printf("%.6lf useconds elapsed\n", t2-t1);
     
      return 0;
    }



    Niestety jest bezwładność w wywoływaniu funkcji sleep(1) rzędu mikrosekund

    źródło:

    Unix, C, and C++
    Function Reference
    Time



    pozdrawiam

    0