piątek, listopada 13, 2009

Go wolniejsze od C i JavaScript, i ciut szybsze niż Java ;-) [a jednak od Java'y też wolniejsze]

[update: 17/11/2009 0:08 - pozmieniałem trochę treść wpisu żeby oddawał rzeczywiste wyniki :-)
update: 14/11/2009 1:06 - Oszukałem się ;-) Go wcale takie szybkie nie jest, jeśli zwrócicie uwagę na program w Go i te w innych językach to zauważycie istotną różnicę, wszystkie języki poza Go używały odpowiednika math.pow() czyli potęgowania, w Go użyłem przez pomyłkę math.exp(), różnica jest znacząca, bo po użyciu math.Pow() prędkość spadła do 8.521 ms na 1 iterację.
W Java'ie program używający math.exp() zamiast math.pow() potrzebuje na wykonanie 1 iteracji tylko 1.37 ms, a JavaScript w Firefoksie tylko 0.74 ms, C++ 32 bitowy zaś 0.5 ms.
Go więc szybkie nie jest, w podanym przykładzie program w Go jest wolniejszy od Java'y]

Google wypuściło swój nowy język o nazwie Go.
Nie ma go dla Windowsa, jest na razie tylko dla Linuksa i MacOSa.
Sam język mi się nie podoba. Szczególnie bałagan z brakiem konwersji typów.
Język jest przemądrzały i wie lepiej od Ciebie czego chcesz, czyli gdy użyjesz:


f:=10.0;
To zgadnie, że na pewno chcesz użyć typu float, ale gdy spróbujesz tego f użyć w miejscu gdzie Go oczekuje float64 to dostaniesz info o błędzie i tyle.
Żeby drania przechytrzyć trzeba użyć:


var f float64=10.0;
co już takie czytelne nie jest.
Ale rzeczywiście Go wydaje się szybkie.
Znów napisałem w nim całkowanie numeryczne ;-), którego kod poniżej:

package main

import "fmt"
import "math"
import "time"

func calc() float {
var sum float=0.0;
var start=0.0;
var stop=10000.0;
var d float=20.0/stop;
for i:=start; i<stop; i++ {
var x float=d*i-10.0;
sum=float(sum+float(math.Exp(float64(-x*x)))*(20.0/stop));
}
return sum;
}

func test() {
start:=time.Nanoseconds();
for i:=0; i<1000; i++ {
calc();
}
stop:=time.Nanoseconds();
var time = float64(stop-start)/1000/1000;
fmt.Printf("%f\n",float64((time)/1000));
}

func main() {
test();
test();
test();
test();
test();
test();
test();
test();
}
Wszystko uruchamiałem na Ubuntu 9.10 w VMware Player 3.0. I zaskoczenie, wynik jest całkiem niezły bo wynosi 3.183 milisekundy na 1 iterację [przy wykonywaniu math.Exp(), jednak wszystkie inne języki były testowane z liczeniem potęgi czyli math.Pow(), wtedy czas wynosi 8.521 ms na 1 iterację]. [Z czasu wykonania kodu dla JavaScript'u mogę wnosić, że różnica w prędkości wykonania między hostem Windows a systemem w VMPlayer wynosi jakieś 1.5, co dawało by jakieś 2.1-2.2 ms na 1 iterację ;-) [a w rzeczywistości 5.5-6 ms], nieźle, ale nadal wolniej od Java'y, która wykonywana w tym samym środowisku potrzebuje 2 razy mniej czasu na wykonanie tego samego zadania. Trzeba jednak pamiętać, że kompilator Go dla 32 bitów nie produkuje chyba najszybszego kodu, bo główny development odbywa się w wersji 64 bitowej. Trzeba też przyznać, że sam kompilator jest NAPRAWDĘ szybki :-)
Jako jednemu z niewielu produktów Google nie życzę temu językowi na razie zbyt dużych sukcesów ;-) i na razie to nazwałbym ten język Błe.. ;-)


Podobne postybeta
Język Go dla Windows :-)
Raspberry Pi to nie jest demon prędkości ;-)
Całkujący Dart ;-)
Go dla Java'owca ;-) odcinek 1 "klasy"
Plus dla Scala, minus dla Groovy ;-)