Panowie postanowiłem wykonać test wbudowanych w atmel studio typów fixed point vs float. Na razie tylko samych _Accum z saturacją ale to co zobaczyłem nie napawa optymizmem gdzie jest błąd?Dodam że
-atmel studio 7,
-wewnętrzny zegar 8MHz
-Atmega16.
-Do pomiaru czasu używam timer 1.
Najpierw kod, testujemy 4 działania +,-,*,/ dla typu _Accum i float. Do odmierzania czasu używam timera 1, z preskalerem równym 1. Przed działaniem zeruje TCNT1 po działaniu zapisuję do zmiennej tymczasowej wartość rejestru TCNT1, wyświetlam i znowu zaczynam kolejne obliczenia.
Czas na wyniki(wartość TCNT1):
Dodawanie:
Accum float
32 123
dla dodawanie jeszcze przeliczę na mikro sekundy to będzie 256 mikrosekund dla Accum, dla float 984 mikrosekundy.
odejmowanie:
30 132
Mnożenie
245 160
Dzielnie:
1164 499
Teraz zbadałem jeszcze pamięć tzn. w programie od komentowany był tylko _Accum lub float i w pętli jedno działanie + lub - lub * lub /, czyli np.
Rekompilacja, sprawdzenie ile zajmuje, zmiana typu działania rekompilacja i tak dla każdego działania i typu.
wyniki:
dodawanie/odejmowanie:
708 bytes 4,3% accum
1070 bytes 6,5% float
mnożenie:
918 bytes 5,6% accum
1070 bytes 6,5% float
dzielnie:
1524 bytes 9,3% accum
1080 bytes 6,6% float
Aż chce się rzec wtf?!używanie typów fixed point z gcc kontra float jest wydajniejsze tak naprawdę tylko przy dodawaniu i odejmowaniu? Czy to wina kompilatora wbudowanego w AS7? Czy mam jakiś błąd w kodzie którego nie widzę?
-atmel studio 7,
-wewnętrzny zegar 8MHz
-Atmega16.
-Do pomiaru czasu używam timer 1.
Najpierw kod, testujemy 4 działania +,-,*,/ dla typu _Accum i float. Do odmierzania czasu używam timera 1, z preskalerem równym 1. Przed działaniem zeruje TCNT1 po działaniu zapisuję do zmiennej tymczasowej wartość rejestru TCNT1, wyświetlam i znowu zaczynam kolejne obliczenia.
Kod: C / C++
Czas na wyniki(wartość TCNT1):
Dodawanie:
Accum float
32 123
dla dodawanie jeszcze przeliczę na mikro sekundy to będzie 256 mikrosekund dla Accum, dla float 984 mikrosekundy.
odejmowanie:
30 132
Mnożenie
245 160
Dzielnie:
1164 499
Teraz zbadałem jeszcze pamięć tzn. w programie od komentowany był tylko _Accum lub float i w pętli jedno działanie + lub - lub * lub /, czyli np.
Kod: C / C++
Rekompilacja, sprawdzenie ile zajmuje, zmiana typu działania rekompilacja i tak dla każdego działania i typu.
wyniki:
dodawanie/odejmowanie:
708 bytes 4,3% accum
1070 bytes 6,5% float
mnożenie:
918 bytes 5,6% accum
1070 bytes 6,5% float
dzielnie:
1524 bytes 9,3% accum
1080 bytes 6,6% float
Aż chce się rzec wtf?!używanie typów fixed point z gcc kontra float jest wydajniejsze tak naprawdę tylko przy dodawaniu i odejmowaniu? Czy to wina kompilatora wbudowanego w AS7? Czy mam jakiś błąd w kodzie którego nie widzę?
