piątek, października 14, 2011

Całkujący Dart ;-)

Ponieważ pojawił* się nowy język, czyli Dart to wypadałoby wykorzystać go do tego niecnego celu do którego wykorzystuję wszystkie języki ;-)
Trzeba w nim napisać całkowanie numeryczne i sprawdzić jak szybko się wykona :-)
Oto program w Darcie:
var N=10000;
var M=1000;
num calc() {
var sum = 0.0;
for (var i=0; i<N; i++) {
var x = 20.0*i/N-10.0;
sum+=Math.pow(Math.E, -x*x)*(20.0/N);
}
return sum;
}
main() {
var s=0.0;
var start = Clock.now();
var time = Clock.now();
var m = 0;
while ((time-start)<5000) {
for (var i=0; i<100; i++) {
s+=calc();
}
m++;
time=Clock.now();
}
time = Clock.now()-start;
print(m);
print(time);
print(time/(m*100.0));
}


Jak też to to cudo działa można dowiedzieć się tutaj (w celu uruchomienia programu należy kliknąć na strzałkę nad kodem).

Sam program powstał w bardzo prosty sposób, wziąłem oryginał w Java'ie i dokonałem w nim drobnych zmian. Na pierwszy ogień poszło to, że usunąłem słowa public i private, następnie final i static, deklarację klasy owijającej kod i wyrzuciłem argumenty z main(). Do tego trzeba było zmienić wywołania metod z Java'owego System tak by odczytywać czas i móc wypisywać wyniki.... a i jeszcze trzeba było wyrzucić typ long i zmienić go na int.
Program działał, ale nie był zbyt szybki, więc kolejnym krokiem było wyrzucenie typów i zastąpienie ich słowem kluczowym var, które spowodowało, że kompilator sam sobie użył swoich typów (choć nie wiem do końca czy to tak działa, w każdym bądź razie programik przyśpieszył po tym zabiegu).

Teraz pytanie: jak to w ogóle działa?
Prosto :-) Do serwera wysyłany jest kod w Dart'cie, a serwer odsyła "kompilat" w JavaScripcie.
Przy okazji w sieci wiele osób przeżywa, że ten "kompilat" ma ponad 17 tysięcy linii i że to niby dowodzi jak jest słabo...... to radzę zajrzeć do środka ;-) większość z tych 17 tysięcy linii to elementy dodawane z automatu, jak rozumiem gdy Dart dojrzeje (albo jeśli dojrzeje) to w przypadku wykonywania nie wersji Dartowej, a tej skompilowanej do JS większość tego kodu będzie zaciągana raz i będzie mogła służyć wszystkim programom w Darcie.

Np. po skompilowaniu metoda calc() wygląda tak:

function tator89da13$calc$member(){
var tmp$0;
var sum = 0;
{
var i = 0;
for (; LT$operator(i, tator89da13$N$getter()); tmp$0 = i , (i = ADD$operator(tmp$0, 1) , tmp$0)) {
var x = SUB$operator(DIV$operator(MUL$operator(20, i), tator89da13$N$getter()), 10);
sum = ADD$operator(sum, MUL$operator(Math$Dart.pow$member(Math$Dart.E$getter(), MUL$operator(negate$operator(x), x)), DIV$operator(20, tator89da13$N$getter())));
}
}
return sum;
}

Prawie "słowo w słowo" jak oryginał w Dart'cie :-)

Co do czasu wykonania to nie jest za różowo, na moim laptopie to zwykle koło 2.8 ms (w Chrome, w Firefoksie 2.1-2.2 ms) na jedno wykonanie metody calc(). Dla porównaniu wersja w JavaScript'cie potrzebuje w Chrome 1.78 ms, a w Firefoksie 1.488 ms.

Teraz jestem ciekaw czy ewentualne dodanie Darta do Chrome będzie oznaczało dodanie wirtualnej maszyny dla Darta, czy raczej narzędzi do kompilacji do JavaScripta i późniejszym wykonywaniu takiego kodu w V8?
Szczerze to szczegół, niech po prostu dodadzą Darta :-)



* - słowo pojawił jest zbyt duże, pojawi się dopiero gdy będzie go można używać w przeglądarce, teraz się nie da, a nawet do końca nie wiadomo czy można się bawić samym Dartem pod Windows, bo trzeba go sobie samemu zbudować, a do tego jest potrzebne VisualStudio..... bo trzeba zbudować część Chrom by móc go użyć ;-)


Podobne postybeta
Raspberry Pi to nie jest demon prędkości ;-)
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]
Plus dla Scala, minus dla Groovy ;-)
Poskramianie Darta ;-)