czwartek, lipca 26, 2012

Raspberry Pi to nie jest demon prędkości ;-)

Wczoraj dotarło do mnie moje Raspberry Pi :-)


Najpierw je w pracy podpiąłem do pracowego monitora i wszystko ładnie działało, później w miejscu spania podpinałem się do archaicznego telewizora i przy pierwszej próbie poległem... głównie chyba przez to, że mój kabel konwertujący z RCA na Euro był popsuty, myślałem, że już więcej nie zdziałam ale w środku nocy dotarło do mnie, że przecież telewizor twierdzi, że ma SVHS to wstałem i sprawdziłem :-) Zadziałało :-)
Na dziś w planie było uruchomienie sieci WiFi, ale chyba mnie przerosło ;-)

No to pojechałem standardem i zacząłem uruchamiać na Raspberry Pi moje programy do całkowania numerycznego by umiejscowić je gdzieś na skali "mocy obliczeniowej" ;-)

Powiem w skrócie - cudów nie ma ;-)

Najpierw programik w Pythonie:

import time
import math

N=10000
M=100

def calc():
sum=0
for i in range(0,N):
x=20.0*i/10000.0-10.0
sum=sum+math.pow(math.e,-x*x)*20.0/10000.0

start = time.time()
for i in range(0,M):
calc()
print ((time.time()-start)*1000/M)

Programik uruchomiłem na Raspberry Pi, na moim tablecie EEE Pad Transformer i na moim laptopie z procesorem Intel Core i7-3610QM.
Wynik wyglądały tak (czas 1 iteracji):
Raspberry Pi - 259 ms
EEE Pad Transformer - 94 ms
Intel Core i7-3610QM - 5 ms

Raspberry Pi okazało się więc około 50 razy wolniejsze w wykonywaniu programu w Pythonie niż Intel :-) i 2.7 raza wolniejsze niż EEE Pad Transformer z Tegra 2.

Kolejnym testem był programik w C:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

#define N 10000
#define M 1000

double calc() {
int i;
double sum = 0;
for(i=0; i<N; i++) {
double x = 20.0*i/N-10.0;
sum+=pow(M_E, -x*x)*(20.0/N);
}
return sum;
}

int main(int argc, char *argv[])
{
int i;
long m=0;
double s = 0;
long start = clock();
long time_ = clock();
while ((time_-start)<5*CLOCKS_PER_SEC) {
for (i=0; i<100; i++) {
s+=calc();
}
m++;
time_=clock();
}
time_ = (clock() - start)/CLOCKS_PER_SEC*1000;
printf("%f\n", time_*1.0/(m*100));
// system("PAUSE");
return 0;
}

Tutaj test uruchomiłem tylko na Raspberry Pi i i7.
Wyniki przedstawiają się tak:
Raspberry Pi - 12.5 ms
i7 - 0.85 ms (MingW)
i7 (Linux w VMWare Player) - 0.65 ms (GCC)
i7 - 0.2 ms (kompilator z Visual C++ Express)

Tu porównanie jest trudniejsze bo nie testowałem tego na tym samym kompilatorze. Widać, że wersja skompilowana GCC z MingW była wolniejsza od GCC uruchomionego na Linuksie siedzących w VMWare Playerze co sugeruje, że GCC z MingW nie jest najlepszą implementacją ;-)

Patrząc na wyniki tak dla Pythona jak i dla C widać jednak, że Raspberry Pi jest "trochę" w tyle ;-)
Jeśli szukalibyśmy jakiegoś porównywalnego PC, to stosując sztuczkę z odwróceniem działania prawa Moora to byłby to PC z przed 8.5-10 lat :-)


Podobne postybeta
Całkujący Dart ;-)
C# i Java okazały się szybsza od Pythona :-) [było Java okazała się szybsza od C# i Pythona]
Go wolniejsze od C i JavaScript, i ciut szybsze niż Java ;-) [a jednak od Java'y też wolniejsze]
Język Go dla Windows :-)
Plus dla Scala, minus dla Groovy ;-)

4 komentarze:

  1. Witaj,
    Twój ostatni wniosek nie jest do końca sprawiedliwy.

    Prawo Moore'a można określać na wiele sposobów.

    Z jednej strony, możesz powiedzieć że po dwóch latach, za te same pieniądze kupisz komputer o 2x większej mocy obliczeniowej.

    Z drugiej strony, że za podobny sprzęt zapłacisz już tylko połowę ceny.

    RPi ma procesor o mocy zbliżonej do maszyn z przed 10 lat, owszem. Tyle że cena jest inna. Teraz płacisz $35 za płytę główną, a ile byś zapłacił wtedy?

    To nie wszystko, bo pominąłeś kilka istotnych rzeczy:

    RPi ślicznie radzi sobie z filmami w jakości HD (Polecam zabawę z XBMC - najłatwiej zainstalować OpenELEC). Czy 10 lat temu, był byś w stanie za rozsądne pieniądze kupić kartę graficzną o podobnych parametrach?

    Zasilacz -- Ile prądu zżerały ówczesne maszyny? O ile pamiętam, to właśnie 10 lat temu przestały wystarczać zasilacze 200W i zaczęto ładować coraz większe potwory.

    Maszyna z tego okresu to wielka hałaśliwa skrzynia, która przy awarii wiatraka szybko zamieniała się w kupę przegrzanego złomu.

    Teraz mój RPi działa na zasilaczu z telefonu -- 750mA, a zapewne mógł by być mniejszy. Obudowę zrobiłem mu z kasety magnetofonowej http://blog.szsz.pl/2012/07/raspberry-pi-obudowa.html -- sorki za obrzydliwą autoreklamę ;)

    RPi nie jest komputerem ogólnego przeznaczenia - mimo że teoretycznie mógł by pełnić taką rolę.

    Jeśli oczekujesz szybkiej przeglądarki, lub maszynki do mielenia cyferek, to faktycznie się rozczarujesz. Jednak jest dużo zastosowań, do których PC się nie nadawał, natomiast to maleństwo jest wprost idealne.

    Pozdrawiam,
    Red.

    ps.
    ... Ach jeszcze jedno.

    Jeśli chciał byś pobawić się domową elektroniką... Do niedawna za podobne pieniądze mogłeś sobie najwyżej poskładać 8bit maszynkę na Atmelu.

    Kupno, to już znacznie większy wydatek - zobacz ile kosztuje popularne Ariduno.

    pps.
    Swojego czasu dyskutowaliśmy o szybkości Javascript. Ło kurcze, lata minęły... Wtedy coś mi nie pasowało w wynikach Twoich testów -- teraz po dłuuugiej przerwie zorientowałem się o co chodziło. Tak na prawdę nie mierzyłeś szybkości danego języka tylko funkcji Math.pow -- idę o zakład że profiler pokazał by że 90% czasu program spędza przy tej jednej funkcji. Przecież potęgowanie jest wręcz legendarnie niewydajne.

    OdpowiedzUsuń
  2. Zacznijmy od tego, że ja tu nie stawiam zarzutu w stylu "ale ten szajs wolny", po prostu byłem ciekaw jak wygląda wydajność malinki w porównaniu do PC.
    Mam pewne cele dla Malinki i ciekaw byłem jak sobie z nimi poradzi. Widzę, że np. coś co mój laptop liczy w 5 sekund malina będzie robić przez 10-20 minut (u mnie w 5 sekund robią to 4 rdzenie udające 8, każdy z 50 razy szybszy od Malinki), co mi akurat nie przeszkadza. Choć przyznaję, że wcześniej myślałem, że ciut szybsza będzie.
    Nie ma co porównywać obliczeń do mocy, bo moje i7 bierze do 45W, a Malinka 0.7W, czyli zakładając, że jest 50 razy wolniejsze to zużywa jakieś 77% mocy tego czego potrzebuje i7 na 1 "jednostkę obliczeniową". [chociaż w i7 te 45W jest na 4 rdzenie, co by oznaczało, że Malina potrzebuje 311% mocy na 1 "jednostkę obliczeniową" ;-)

    Tak, to mierzy pow, a pow daje dość dobre przybliżenie tego jak działają zmienneprzecinki.

    OdpowiedzUsuń
    Odpowiedzi
    1. Przemku czy podałeś obliczenia poboru mocy dla samego procesora malinki czy wszystkich komponentów :P ?

      Usuń
    2. Ludzie ciągle zakładają że RPI ma być jakąś nieziemską maszyną a on ma służyć do nauki programowania :) i zabawy elektroniką Przemku porównaj Arduino do malinki :P a nie i7:P Sam procesor malinki pobiera coś koło 200mW przy max wykorzystaniu

      Usuń