Dobrym pytaniem, które zadać można sobie przy okazji wykorzystywania wyprowadzeń ogólnego przeznaczenia (GPIO) w Raspberry Pi, jest pytanie o ich prędkość. Zasadniczo, jak szybko można z tych pinów czytać i jak szybko można zapisywać na nie stan logiczny? Spróbujmy na to odpowiedzieć prostym testem, którego wyniki są co najmniej zaskakujące.
Test
Wszystkie opisane poniżej testy zrealizowane były z konta roota na Raspberry Pi B+ pod Raspbianem w buildzie Jessie (RPi 2 jest generalnie 2..3 razy szybsze). Prędkość działania GPIO wyznaczona została z ilości cykli czy iteracji wykonanych w określonym czasie.
Jak szybko zapisywać można sygnał na GPIO?
Autor zdecydował się przetestować dwa języki często używane na RPi - Pythona i Natywne C - aby sprawdzić jak szybko będą one działały. Do testu dołączono także Go, które nie było jeszcze testowane w tego rodzaju sposób podczas generowania przebiegu prostokątnego. W poniższej tabelce znajdziemy wyniki testu:
| Język | Częstotliwość pracy |
| Python | 68 kHz |
| Go | 174 kHz |
| C | 15 MHz |
Rezultaty osiągnięte dla Pythona i C są podobne do tych, jakie osiągali inni mierząc prędkość GPIO, jednakże rezultat otrzymany dla Go jest całkiem zaskakujący. Okazuje się, że programy napisane w tym języku działają całkiem szybko na RPi, jest to najszybszy kod, poza C, jaki można mieć. Jest to zasługa biblioteki stworzonej przez Stiana Eikelanda.
Jak szybko można czytać z GPIO do pamięci?
Kolejnym pytaniem było to, jak szybko odczytywać można dane z GPIO. W tym przypadku chcemy możliwie szybko i często odczytywać dane z GPIO do pamięci, tak aby uniknąć powstania wąskiego gardła - zapisu na dysk. W tym teście porównano tylko Go i C - dwa najszybsze języki.
| Język | Częstotliwość pracy |
| Go | 1,6 MHz |
| C | 7,2 MHz |
Czy trudniej jest czytać czy pisać w danym języku? Dla C, odczyt jest trudniejszy, jako że program w tym języku czyta mniej więcej z połową prędkości zapisu, oznacza to, że wykrywanie zmian stanu pinu jest cztery razy wolniejsze niż zmiana stanu pinu. Z kolei program napisany w Go potrafi szybciej odczytywać niż zapisywać. Go wydaje się być dobrą alternatywą do C dla programów, które mają za zadanie odczytywać wartości z GPIO.
Te prędkości odczytu są zasadniczo górną granicą prędkości odczytu. Program czyta wartość do pamięci i nic z nią nie robi. W praktycznej aplikacji chciałoby się obrabiać jakoś te dane i najpewniej zapisywać je na dysk, co powoduje powstanie wąskiego gardła dla danych właśnie w tym miejscu. To doprowadza nas do ostatniego pytania:
Jak szybko można czytać GPIO na dysk?
Ten eksperyment jest podobny do poprzedniego, z tym że w tym przypadku programy w Go i w C zbierają poszczególne odczytane bity w bajty i zapisują je w bloki po 1000 bajtów na dysku. Rezultaty są dosyć zaskakujące:
| Język | Częstotliwość pracy |
| Go | 440 kHz |
| C | 673 kHz |
Co było zaskakujące, to to że Go dogania C, jeśli chodzi o prędkość. Go wydaje się być zatem dobrze zoptymalizowane jeśli chodzi nie tylko o odczyt GPIO, ale także o zapis danych na dysku. Jeśli dodamy do tego łatwość z jaką programuje się w Go, może to być bardzo dobre rozwiązanie dla programów, które odczytują wartości z pinów GPIO.
Źródło:
http://rpiai.com/benchmarking-gpio-pins-of-ra...i-model-b-plus/index.html#.VXQuLXj2pc0.reddit
Fajne? Ranking DIY