Ruby najszybciej rosnącym językiem

Opublikowane przez Jarosław Zabiełło Thu, 04 Jan 2007 17:00:00 GMT

Ruby ostro idzie do przodu przesuwając się w górę na liście popularności oczko za oczkiem. Wg TIOBE Programming Community Index Ruby był językiem roku 2006 (w styczniu 2007 Ruby jest 10 pozycji). Z pewnością przyczynił się do tego framework Rails. Pewnie z tego samego powodu (tu jest nią AJAX) rosnie popularność języka JavaScript.

Dawniej popularność języka dyktowało wsparcie dużych firm (Sun dla Javy i Microsoft dla C#). Ale współcześnie dużo większe znaczenie zaczyna mieć “killer application” (“zabójcza” aplikacja promująca język w jakim została napisana) oraz to co twierdzi internet. Stąd zwycięzcy w ostatnich dwóch latach (PHP i Java) w tym roku (2006) są przegranymi.

Można też zauważyć trend rosnącej popularności języków typowanych dynamicznie przy malejącym tych typowanych statycznie. Ale to nic dziwnego. Od czasu przełamania pewnej bariery wydajności sprzętu upadł główny powód od aby nie korzystać z języków dynamicznych na szerszą skalę. (Z pewnością taki Smalltalk narodził się zdecydowanie w złym czasie) Ciekawa jest też uwaga, że większość popularności języka PHP nabijana jest jego problemami z bezpieczeństwem zamiast faktycznym uzyskiwaniem popularności w kręgach programistów.

Interesujące jest również to, że szybko zdobywa popularność język D, o którym do niedawna mało kto słyszał. To dosyć ciekawy język i do tego ekstremalnie szybki (stosuje jakieś agresywne algorytmy kompilacji). Ma też automatyczne zarządzanie pamięcią (garbage collector). Chyba może bez kompleksów iść na wojnę C++, Javą czy C#. (Zobacz porównanie D z innymi językami.)

Z kolei z języków bardziej niszowych odnotować można wzrost popularności Lua (z pozycji 58 na 47) oraz funkcyjnego Haskella (z 56 na 42). Przewiduje się też, że z powodu oczekiwanej migracji z C++ i Visual Basic, w roku 2007 zwycięzcą w kategorii najbardziej popularnego języka, będzie C#.

Tagi , , , , , , ,  | 3 comments

Ruby 1.9 (YARV) vs. Python, Lua & PHP

Opublikowane przez Jarosław Zabiełło Mon, 01 Jan 2007 18:36:00 GMT

Korzystając z tego, że niedawno do repozytorium Rubiego został dodany YARV (wirtualna maszyna Rubiego) pokusiłem się o małe porównanie wydajności. Jako test użyłem prostego programu jaki pojawił się na liście pl.comp.lang.pyhon (musiałem tylko trochę zwiększyć pętle do 10 milionów iteracji, aby były widoczne jakieś wyniki) Użyty sprzęt: Athlon64 3700+, 64bit Ubuntu 6.0.6.

Sprawdziłem też z ciekawości PHP 5.2 na tym samym sprzęcie. Dla tak prostego testu powinien móc dać z siebie wszystko. Jest jednak wolniejszy od Rubiego 1.9.

Kod dla Pythona:

import time
t=time.time()
a=0
for i in xrange(10000000):
    a += i
print a
print time.time() - t
Kod dla Lua:
t = os.clock()
a = 0
for i = 1,10000000 do
    a=a+i
end
print(a)
print(os.clock() - t)

Kod dla Rubiego:

t = Time.now
a = 0
for i in 1..10_000_000
  a = a+i
end
puts a
puts Time.now - t

Kod dla PHP:

<?php
function microtime_float() {
 $time = microtime();
 return (double)substr($time, 11) + (double)substr($time, 0, 8);
}
$t =  microtime_float();
$a = 0;
for ($i = 0; $i < 10000000; $i++) {
  $a += $i;
}
print "$a\n";
print  microtime_float()- $t;
?>

Wyniki:

  1. Lua: 1.14 s
  2. Ruby 1.9: 1.49 s
  3. PHP 5.2: 1.74 s
  4. Python 2.5: 2.64 s
  5. Python 2.4.3: 2.72 s
  6. Ruby 1.8.5: 3.83 s.

Drugie podejście

Tym razem wynik uśredniam dla 10 prób. Zwiększyłem ilość iteracji do 20 mln. No i… Ruby 1.9 pobił wszystko. Zarówno Pythona jak i Lua! (PHP 5.2 po 30 sek. zgłosił timeout. Musiałem więc uśrednić po 5 wynikach.)

PYTHON

import time
def bench():
    a, t = 0, time.time()
    for i in xrange(20000000):
        a+=i
    return time.time()-t
result = 0
for i in range(10):
  result += bench()
print result / 10.0

RUBY

def bench
  a, t = 0, Time.now
  20_000_000.times { |i| a += i }
  Time.now - t
end
result = 0
10.times { |i| result += bench }
puts result / 10

LUA

function bench()
  a = 0
  t = os.time()
  for i = 1, 20000000 do
    a = a + i
  end
  return os.time() - t
end
result = 0
for x = 1,10 do
  result = result + bench()
end
print(result/10)

PHP

<?php
function bench() {
  $a = 0;
  $t =  time();
  for ($i = 0; $i < 20000000; $i++) $a += $i;
  return time() - $t;
}
$result = 0;
for ($x = 1; $x <= 5; $x++) $result += bench();
print $result / 5.0;
?>

Wyniki

  1. Ruby 1.9: 2.0953268 s.
  2. Lua 5.1: 2.4 s.
  3. Python 2.5: 2.49481592178 s.
  4. Python 2.4.3: 2.71687791348 s.
  5. PHP 5.2: 4.2 s.
  6. Ruby 1.8.5: 9.0153751 s.

Jestem ciekaw kiedy wyjdzie Rails dostosowany do Ruby 1.9. Zapowiada się bardzo obiecująco!

Posted in , ,  | Tagi , , , , ,  | 19 comments