Informatyka 2

Transkrypt

Informatyka 2
Informatyka 2
Analiza efektywności algorytmów
1. Pomiar czasu wykonania
Zapoznaj się z narzędziami do pomiaru czasu wykonania fragmentu kodu, np. procedur. Przeanalizuj
ich działanie.
• double difftime(time_t, time_t):
przykładowy sposób użycia:
#include <stdio.h>
#include <time.h>
#include <windows.h>
int main()
{
int i;
double tWykonania;
time_t tPoczatku, tKonca;
time(&tPoczatku);
for(i=0;i<=2000;i++)
{
printf("%d\n",i);
}
Sleep(1257);
time(&tKonca);
tWykonania=difftime(tKonca,tPoczatku);
printf("\n\ntrwalo to %.0f sekund",tWykonania);
return 0;
}
•
long int GetTickCount():
przykładowy sposób użycia:
#include <stdio.h>
#include <time.h>
#include <windows.h>
int main()
{
int i;
long int tWykonania;
long int tPoczatku, tKonca;
tPoczatku=GetTickCount();
for(i=0;i<=2000;i++)
{
printf("%d\n",i);
}
Sleep(1257);
tKonca=GetTickCount();
tWykonania=tKonca-tPoczatku;
printf("\n\ntrwalo to %d milisekund\n\n",tWykonania);
return 0;
}
•
BOOL QueryPerformanceCounter(LARGE_INTEGER*)
przykładowy sposób użycia:
#include <stdio.h>
#include <time.h>
#include <windows.h>
int main()
{
int i;
long long int ileTaktowUplynelo;
long double ileMikroSekundUplynelo;
LARGE_INTEGER taktPoczatku, taktKonca, taktowNaSekunde;
QueryPerformanceFrequency(&taktowNaSekunde);
printf("taktow na sekunde: %d",taktowNaSekunde.QuadPart);
QueryPerformanceCounter(&taktPoczatku);
for(i=0;i<=2000;i++)
{
printf("%d\n",i);
}
Sleep(1257);
QueryPerformanceCounter(&taktKonca);
ileTaktowUplynelo=taktKonca.QuadPart-taktPoczatku.QuadPart;
ileMikroSekundUplynelo=((long double)ileTaktowUplynelo*1000000)/
(long double)taktowNaSekunde.QuadPart;
printf("\n\ntrwalo to %d taktow zegara CPU\n\n",ileTaktowUplynelo);
printf("trwalo to %f us\n\n",ileMikroSekundUplynelo);
return 0;
}
Napisz program, w którym do pomiaru czasu tego samego zestawu instrukcji (tego samego
fragmentu kodu) użyto wszystkich trzech, przedstawionych powyżej sposobów.
Niech mierzoną instrukcją będzie pętla wykonywana n razy, która przy każdym wykonaniu drukuje
numer iteracji oraz czeka s milisekund (funkcja Sleep(int)).
Program ma w czytelny sposób zestawiać na ekranie wyniki pomiarów czasu wykonane opisanymi
metodami.
Przeanalizuj różnice między pomiarami.
2. Ciąg Fibonacciego
Ciąg Fibonacciego to ciąg liczb naturalnych określony w sposób następujący:
Wyrazy
ciągu Fibonacciego przyjmują wartości:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181.
Napisz 2 funkcje. Obie mają przyjmować jako parametr numer wyrazu ciągu Fibonacciego i zwracać
obliczoną wartość tego wyrazu:
a. long int fibonacciIteracyjny(int)
ma wykorzystywać iteracyjny algorytm obliczania wartości wyrazu ciągu.
b. long int figonacciRekurencyjny(int)
ma wykorzystywać rekurencyjny algorytm obliczania wartości wyrazu ciągu.
3. Analiza efektywności.
Wykorzystując mechanizmy poznane w pkt. 1 instrukcji przeprowadź analizę czasu wykonania:
a. dla obu stworzonych zgodnie z punktem 2. funkcji obliczających wartość elementu ciągu
Figonacciego w zależności od numeru elementu ciągu.
Dane z analiz mają być zapisywane do plików .csv zgodnie z przykładowym formatem:
#komentarz: opis analizy
numerElementu1,
czasTrwania1
numerElementu2,
czasTrwania2
numerElementu3,
czasTrwania3
...
Kryteria oceny programów:
•
•
•
•
•
a1 – zgodność działania programu z podaną specyfikacją: 5 pkt.,
a2 – poprawność wykorzystania elementów języka C (pętle, instrukcje sterujące, struktury,
odczyt i zapis do plików...): 5 pkt.,
a3 – styl programowania (wcięcia w kodzie, intuicyjne nazwy zmiennych, rozbicie programu
na funkcje, stosowanie komentarzy): 5 pkt.,
a4 – odporność programów na błędnie podane dane oraz błędy w plikach: 5 pkt.,
a5 – terminowość oddania programu: -1 pkt za każdy dzień spóźnienia.
TERMIN KOŃCOWY ROZLICZENIA Z w/w ZADAŃ:
25.10.2010r. (godz. 15:00)