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 ;-)