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)