Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się w 1s

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
p69d
Sędziwy Jeż
Sędziwy Jeż
Posty: 41
Rejestracja: 04 wrz 2010, 14:14
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się w 1s

Post autor: p69d »

Witam.

Tak jak w temacie. Mam do wykonania takie zdanie jak poniżej je przedstawiam (tekst pogrubiłem ponieważ w znacznikach "code" wyświetlał się on przynajmniej u mnie w jednej ciągłej linii). Proszę o pomoc w napisaniu takiego zadania.

Procesor o prędkości 2 MIPS wykonuje około 2 instrukcji na mikrosekundę. Przyjmując, że każdy tik zegara sprzętowego powoduje wygenerowanie przerwania, podaj powody, dla których rozdzielczość zegara nie wynosi 1 mikrosekundę. Napisz program liczący, ile razy wartość zwracana przez funkcję gettimeofday zmienia się w ciągu jednej sekundy. Zmodyfikuj swój program tak, aby wyświetlał te różnice.

Kolega podał mi taki program.

Kod: Zaznacz cały

#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    struct timeval tv1,tv2;
    struct timezone tz1;
    long int t=0; 
    int ile_zmian=0; 
    int ile_wykonan=0;
    long int temp; 
    long int roznice[1000000]; 
    int i; 

    gettimeofday(&tv1, &tz1); 
    while(t<1000000) 
    {
        gettimeofday(&tv2, &tz1); 
        ile_wykonan++;
        if(tv2.tv_usec!=tv1.tv_usec) 
        {
            temp=tv2.tv_usec-tv1.tv_usec; 
            if(temp<0)
        {
            temp+=1000000; 
        }
            tv1=tv2; 
           t+=temp; 
        printf("%ld\n",temp);
    }
    }

    printf("Czas wykonania programu: %ld us\n",t);
    printf("Funkcja gettimeofday zmienila wartosc %d razy\n",ile_zmian);
    printf("Funkcja gettimeofday wykonala sie %d razy\n",ile_wykonan);
    printf("Rozdzielczosc zegara systemowego wynosi ok. %f us\n", 1000000.0/(float)ile_zmian);
    return 0;
}
Z tego programu rozumiem, że teazmienna

int ile_zmian=0;

odnosi się do tego "[...]wartość zwracana przez funkcję gettimeofday zmienia się w ciągu jednej sekund[...]" - z treści zadania.

Dalej mam pytanie do czego służy ta zmienna "int ile_wykonan=0;" w tym programie. Natomiast ta zmienna "long int roznice[1000000];" odnosi się różnic (niestety nie wiem do jakich) występujących w ciągu jednej sekundy dobrze to rozumiem?

Poniżej tych zmiennych jest cały kod programu, który pokazuje / liczy te zmiany występujące z treści zadania.

Tutaj następuje moja prośba. Muszę zmienić ten program co jest rzeczą oczywistą. Więc poza samymi zmianami nazw zmiennych jak można zmodyfikować ten program aby "robił / liczył" tak jak to wykonuje teraz? Oraz zastanawiam się nad tą częścią zadania "[...]Zmodyfikuj swój program tak, aby wyświetlał te różnice."

PS: Proszę nie usuwać tego tematu. Te wiadomości są mi potrzebne do szkoły. Dokładnie muszę wysłać te rozwiązanie do Niedzieli to jest do dnia 17.10.2010 do godziny 8.00

PS: Jeśli coś moim poście jest nie stosownego według Adminów/Moderatorów będę to poprawiał.
Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: dawwin »

Skoro kolega dał Ci ten program to on też powinien Ci go wytłumaczyć.
Obliczanie ilości zmian gettimeofday() nie będzie zbyt dokładne za względu na ograniczony czas procesora dla Twojego programu.

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

int main()
{
    struct timeval tv, tv2;
    time_t start;
    int i = 0;
    const int seconds = 2;
    int end;

    start = time(NULL);
    /* Czekamy na rozpoczecie nowej sekundy */
    while (start == time(NULL)) {}
    gettimeofday(&tv2, NULL);
    start = tv2.tv_sec;
    end = seconds+start;

    do {
        /* Pobieramy nowe wartosci czasu do struktury */
        gettimeofday(&tv, NULL);
        /* Sprawdzamy, czy sie nie zmienily w porownaniu z poprzednia iteracja */
        if (tv.tv_sec != tv2.tv_sec || tv.tv_usec != tv2.tv_usec) {
            /* Jesli sie zmienily to inkrementujemy zmienna 'i' */
            i++;
            tv2.tv_sec = tv.tv_sec;
            tv2.tv_usec = tv.tv_usec;
        }
        /* Sprawdzamy, czy czas sie nie skonczyl */
    } while (end > tv.tv_sec);

    printf("Czas pracy: %d\nIlosc zmian: %d\n", seconds, i/seconds);
    return 0;
}

Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
p69d
Sędziwy Jeż
Sędziwy Jeż
Posty: 41
Rejestracja: 04 wrz 2010, 14:14
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: p69d »

Widzę, że zmieniłeś ten program. Może mi go wytłumaczyć teraz :)?
Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: dawwin »

Ja go napisałem od nowa. Wytłumaczony jest przez komentarze w kodzie.
Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
p69d
Sędziwy Jeż
Sędziwy Jeż
Posty: 41
Rejestracja: 04 wrz 2010, 14:14
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: p69d »

Ok zapoznam się z tym i jeśli będę miał jeszcze jakieś pytania to będę pisał.


EDIT:
Czemu dałeś w programie "const int second = 2;"?

EDIT2:

treść zadania "[...]Napisz program liczący, ile razy wartość zwracana przez funkcję gettimeofday zmienia się w ciągu jednej sekundy.[...]"

Natomiast Twój program liczy ile razy wartość zwracana przez funkcję zmienia się w ciągu 2sekund dobrze rozumiem?

No i zastanawiam się nad drugą częścią zadania "Zmodyfikuj swój program tak, aby wyświetlał te różnice." hehe bo tak na prawdę nawet nie wiem o jakie różnice chodzi :) ... hehe a pojęcie "swój" jest tutaj względne :D hehe

EDIT3:

Mam do was jeszcze takie pytanie. Znacie odpowiedzi na pytania poniżej?? Tyczę się te pytania tego zadania, które pomógł mi rozwiązać dawwin.

1.Jak wyjaśnisz występujące różnice między tymi wartościami?
2.Jaka jest rozdzielczość zegara systemowego (czas pomiędzy poszczególnymi tikami)?
Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: dawwin »

p69d pisze: Czemu dałeś w programie "const int second = 2;"?
Pomiar z dwóch sekund będzie dokładniejszy
p69d pisze: treść zadania "[...]Napisz program liczący, ile razy wartość zwracana przez funkcję gettimeofday zmienia się w ciągu jednej sekundy.[...]"

Natomiast Twój program liczy ile razy wartość zwracana przez funkcję zmienia się w ciągu 2sekund dobrze rozumiem?
Źle rozumiesz. W ostatniej linii masz

Kod: Zaznacz cały

printf("Czas pracy: %d\nIlosc zmian: %d\n", seconds, i/seconds);
Czyli ilość zmian zostanie podzielona przez liczbę sekund
p69d pisze: No i zastanawiam się nad drugą częścią zadania "Zmodyfikuj swój program tak, aby wyświetlał te różnice." hehe bo tak na prawdę nawet nie wiem o jakie różnice chodzi :) ... hehe a pojęcie "swój" jest tutaj względne :D hehe
Może chodzi o różnicę między rzeczywistą rozdzielczość zegara a tą, którą pokazuje program
p69d pisze: Mam do was jeszcze takie pytanie. Znacie odpowiedzi na pytania poniżej?? Tyczę się te pytania tego zadania, które pomógł mi rozwiązać dawwin.

1.Jak wyjaśnisz występujące różnice między tymi wartościami?
2.Jaka jest rozdzielczość zegara systemowego (czas pomiędzy poszczególnymi tikami)?
Pierwsze tak, jak wyżej, a drugie jest proste i możesz to sprawdzić modyfikując nieznacznie kod, który Ci napisałem. Ale nad tym może sam się zastanów, bo to w końcu Twoje zadanie domowe :-P
Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
p69d
Sędziwy Jeż
Sędziwy Jeż
Posty: 41
Rejestracja: 04 wrz 2010, 14:14
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: p69d »

Chodzi to, że czas pomiędzy poszczególnymi tikami to 2mili sekundy ??

EDIT:
dawwin pisze:Pierwsze tak, jak wyżej, a drugie jest proste i możesz to sprawdzić modyfikując nieznacznie kod, który Ci napisałem. Ale nad tym może sam się zastanów, bo to w końcu Twoje zadanie domowe :-P
Chodzi Ci o tę część kodu ??

/* Pobieramy nowe wartosci czasu do struktury */
gettimeofday(&tv, NULL);
/* Sprawdzamy, czy sie nie zmienily w porownaniu z poprzednia iteracja */
if (tv.tv_sec != tv2.tv_sec || tv.tv_usec != tv2.tv_usec) {
/* Jesli sie zmienily to inkrementujemy zmienna 'i' */
i++;
tv2.tv_sec = tv.tv_sec;
tv2.tv_usec = tv.tv_usec;
Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: dawwin »

Odpowiedź jest w programie, który sam wkleiłeś. Poszukaj
Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
p69d
Sędziwy Jeż
Sędziwy Jeż
Posty: 41
Rejestracja: 04 wrz 2010, 14:14
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: p69d »

dawwin pisze:Odpowiedź jest w programie, który sam wkleiłeś. Poszukaj
Jak uruchomię ten swój program to mi wychodzi taki wynik:

"Rozdzielczość zegara systemowego wynosi ok. inf us"

Pomóż proszę Cię :P
Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: dawwin »

Pytanie:

Kod: Zaznacz cały

2.Jaka jest rozdzielczość zegara systemowego (czas pomiędzy poszczególnymi tikami)?
Odpowiedź:

Kod: Zaznacz cały

printf("Rozdzielczosc zegara systemowego wynosi ok. %f us\n", 1000000.0/(float)ile_zmian);
Obydwie te informacje są w Twoich postach. Twoja zdolność analizowania informacji mnie poraża :pt36:
Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
p69d
Sędziwy Jeż
Sędziwy Jeż
Posty: 41
Rejestracja: 04 wrz 2010, 14:14
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: p69d »

No ok ale chcesz mi powiedzieć, że to jest odpowiedź :) ?? Na pocieszenie powiem Ci, że doszedłem, że mam to tutaj hehe :) .. Jeszcze podaję Ci kod Twojego programu który zmieniłem .. dodałem rozdzielczość zegara TAK MYŚLĘ :)

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

int main()
{
    struct timeval tv, tv2;
    time_t start;
    int i = 0;
    const int seconds = 2;
    int end;

    start = time(NULL);
    /* Czekamy na rozpoczecie nowej sekundy */
    while (start == time(NULL)) {}
    gettimeofday(&tv2, NULL);
    start = tv2.tv_sec;
    end = seconds+start;

    do {
        /* Pobieramy nowe wartosci czasu do struktury */
        gettimeofday(&tv, NULL);
        /* Sprawdzamy, czy sie nie zmienily w porownaniu z poprzednia iteracja */
        if (tv.tv_sec != tv2.tv_sec || tv.tv_usec != tv2.tv_usec) {
            /* Jesli sie zmienily to inkrementujemy zmienna 'i' */
            i++;
            tv2.tv_sec = tv.tv_sec;
            tv2.tv_usec = tv.tv_usec;
        }
        /* Sprawdzamy, czy czas sie nie skonczyl */
    } while (end > tv.tv_sec);

    printf("Czas pracy: %d\nIlosc zmian: %d\nRozdzielczosc Zegara: %d\n", seconds, i/seconds, i);
    return 0;
}
Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: dawwin »

Kod: Zaznacz cały

printf("Rozdzielczosc zegara systemowego wynosi ok. %f us\n", 1000000.0/(float)ile_zmian);
Wartość 'ile_zmian' z Twojego programu odpowiada zmiennej 'i' z mojego. Prościej już się nie da
Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
p69d
Sędziwy Jeż
Sędziwy Jeż
Posty: 41
Rejestracja: 04 wrz 2010, 14:14
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: p69d »

[quote="dawwin"]

Kod: Zaznacz cały

printf("Rozdzielczosc zegara systemowego wynosi ok. %f us\n", 1000000.0/(float)ile_zmian);
no ok rozumiem to (tak mi się wydaje) ale ten kod powyżej nie pokazuje żadnej wartości w programie ... możesz mi powiedzieć czemu? i pokaż mi co w Twoim programie odpowiada za rozdzielczość zegara ... ??
Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: dawwin »

W twoim programie nie pokazuje się żadna wartość ponieważ

Kod: Zaznacz cały

int ile_zmian=0; 
[...]
1000000.0/(float)ile_zmian
Podstawiając jedno do drugiego masz

Kod: Zaznacz cały

1000000.0 /0.0
Sam sobie odpowiedz, jaki jest wynik powyższego wyrażenia

A powinno to wyglądać tak

Kod: Zaznacz cały

printf("Czas pracy: %d\nIlosc zmian: %d\nRozdzielczosc Zegara: %f\n", seconds, i/seconds, 1000000.0 / (float)(i/seconds));
Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
p69d
Sędziwy Jeż
Sędziwy Jeż
Posty: 41
Rejestracja: 04 wrz 2010, 14:14
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Program liczący ile razy wartość zwracana przez funkcję gettimeofday zmienia się

Post autor: p69d »

dawwin pisze:W twoim programie nie pokazuje się żadna wartość ponieważ

Kod: Zaznacz cały

int ile_zmian=0; 
[...]
1000000.0/(float)ile_zmian
Podstawiając jedno do drugiego masz

Kod: Zaznacz cały

1000000.0 /0.0
Sam sobie odpowiedz, jaki jest wynik powyższego wyrażenia

A powinno to wyglądać tak

Kod: Zaznacz cały

printf("Czas pracy: %d\nIlosc zmian: %d\nRozdzielczosc Zegara: %f\n", seconds, i/seconds, 1000000.0 / (float)(i/seconds));

Dzięki wielkie jak będziesz jechał do Płocka to pisz uprzednio do mnie pryw. wiadomość. Zapraszam na piwo :D

PS: Powiedz mi proszę Cię i już dzisiaj Cię nie będę męczył ;D "Rozdzielczość zegara nie wynosi 1 mikrosekundę ponieważ....." To pytanie tyczy się tego: Procesor o prędkości 2 MIPS wykonuje około 2 instrukcji na mikrosekundę. Przyjmując, że każdy tik zegara sprzętowego powoduje wygenerowanie przerwania, podaj powody, dla których rozdzielczość zegara nie wynosi 1 mikrosekundę.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 15 gości