LINUX.ORG.RU

Вышел Ruby 1.8.7

 ,


0

0

Вышло очередное обновление ветки 1.8 языка программирования Ruby.

Данное обновление содержит большое количество исправлений, а так же заимствований из ветки 1.9. Но при этом сохраняет высокий уровень стабильности и обратной совместимости с предыдущими релизами 1.8.*

Список изменений: http://svn.ruby-lang.org/repos/ruby/t...

Скачать можно отсюда: ftp://ftp.ruby-lang.org/pub/ruby/1.8

Ждём Ruby 2.0.

Ждём Ruby 2.0, туда Matz хотел много интересного добавить.

Camel ★★★★★
()

> Список изменений

ну, судя по changelog, увеличения быстродействия ждать не стоит. жаль, ждём 2.0

eveel ★★
()

Небольшой бенчмарк:

# ruby 1.9.0 (2007-12-25 revision 14709) [i486-linux]

% time ruby1.9 fib.rb
9227465
ruby1.9 fib.rb  7.09s user 0.01s system 99% cpu 7.106 total


# ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]

% time ruby1.8 fib.rb
9227465
ruby1.8 fib.rb  25.37s user 3.47s system 99% cpu 28.900 total


# Python 2.5.2

% time python fib.py
9227465
python fib.py  8.84s user 0.02s system 99% cpu 8.886 total


# perl, v5.8.8 built for i486-linux-gnu-thread-multi

% time perl fib.pl 
9227465
perl fib.pl  31.63s user 0.04s system 99% cpu 31.808 total


Так что, над рубином работают, и не такой уж он и тормозной, даже сейчас.

anonymous
()
Ответ на: комментарий от anonymous

 % cat fib.*

# Perl

sub fib {
    my($n) = @_;
    if ($n < 2) {
	return $n;
    }
    else {
	return fib($n - 2) + fib($n - 1);
    }
}

print fib(35), "\n";


# Python

# calculate Fibonacci(35)
# for benchmark
def fib(n):
  if n < 2:
    return n
  else:
    return fib(n - 2) + fib(n - 1)

print fib(35)


# Ruby

# calculate Fibonacci(35)
# for benchmark
def fib(n)
  if n < 2
    n
  else
    fib(n - 2) + fib(n - 1)
  end
end

print(fib(35), "\n");

anonymous
()
Ответ на: комментарий от anonymous

200+ раз медленее Сей это совсем не медленный - мантра. Самовнушать раз в пол часа в психотерапевтических целях.

anonymous
()
Ответ на: комментарий от anonymous

> 200+ раз медленее Сей это совсем не медленный - мантра. Самовнушать раз в пол часа в психотерапевтических целях.

Вы, простите, идиот? Причем тут C? Я сделал небольшое сравнение инструментов, применяемых в сходных задачах, которое ничего не доказывает, но и не позволяет говорить, что руби стоит на месте и тормозной по сравнению с другими подобными инструментами.

anonymous
()
Ответ на: комментарий от anonymous

i486 ? cлака что ли ?

А вот почему есть в проверке R-1.9.0 и нету к примеру
в проверке Py-2.6 или Py-3.0 или Perl 6 ?

Чем отличаеться R-1.9 от других альф ?

--
mx

anonymous
()
Ответ на: комментарий от anonymous

>Причем тут C?

при том, что к примеру ту же жабу применяют в тех же областях (вебня), и она только в 2 раза медленее Сей, и значит в 100 раз быстрее рубина.

anonymous
()
Ответ на: комментарий от anonymous

Те вывод такой :

Существующий Руби равен по скорости существующему Перлу
и тормознее существующего Питона в 3 раза.

И когда выйдет ( если ) руби 1-9 то он будет практически равен по
скорости существующего Питона.

--
mx

anonymous
()

(В очередной раз буду первым)

Лишь PHP воистину глобальный и надежный.

CtrlAltBs
()
Ответ на: комментарий от anonymous

> i486 ? cлака что ли ?

бубунта

> А вот почему есть в проверке R-1.9.0 и нету к примеру в проверке Py-2.6 или Py-3.0 или Perl 6 ?

py-3.0 нет в репозитарии и перла 6 вроде тоже, влюбом случае перл мне не интересен, я его ради чистоты эксперимента включил.

> Чем отличаеться R-1.9 от других альф ?

От каких других?

anonymous
()
Ответ на: комментарий от anonymous

> Те вывод такой :

Нет, вывод не такой, вывод: руби активно развивается, использовать его можно уже сейчас, в недалеком будущем он не будет уступать аналогичным инструментам.

anonymous
()
Ответ на: комментарий от anonymous

> при том, что к примеру ту же жабу применяют в тех же областях (вебня), и она только в 2 раза медленее Сей, и значит в 100 раз быстрее рубина.

Ну, еще есть такое понятие как память...

К тому же, для jvm тоже есть ruby.

anonymous
()
Ответ на: комментарий от anonymous

Хм не знал в Убунте оптимизация 486 ... однако.

> Нет, вывод не такой, вывод: руби активно развивается,
> использовать его можно уже сейчас, в недалеком будущем он не будет
> уступать аналогичным инструментам.

Те сейчас он уступает Питону в 3 раза. И в недалеком будущем догонит сегодняшний Питон, который хз где будет на тот момент ;)
( так как сравнение с py3 не было )

--
mx

anonymous
()
Ответ на: комментарий от anonymous

> Ну, еще есть такое понятие как память...
А ну да ;) Я вот чтоб хоть как то оправдать наличие на домашней машине
х86_64 дистрибута запихал туды 4 гигабайта ;)

> К тому же, для jvm тоже есть ruby.
Для Пистона тоже есть. Кстати для Пистона есть трансляция кода
( с небольшими ограничениями ) в Си а для Руби есть ?

--
mx

anonymous
()
Ответ на: комментарий от anonymous

но даже когда выйдет 1-9, проблем с низкой утилитарностью Руби не решатся я думаю.

ЗЫ Попалился :D

--
mx

anonymous
()
Ответ на: комментарий от anonymous

>А вот почему есть в проверке R-1.9.0 и нету к примеру...

Вот, наслаждайтесь:

python2.5.2 fib.py 8,64s user 0,02s system 99% cpu 8,710 total ruby1.9.0 fib.rb 9,03s user 0,02s system 99% cpu 9,064 total python3.0a5 fib.py 10,22s user 0,01s system 99% cpu 10,237 total ruby1.8.7 fib.rb 16,99s user 0,02s system 99% cpu 17,012 total ruby1.8.6 fib.rb 22,12s user 1,72s system 99% cpu 23,842 total

Все собрано под x86_64. Ось - Ubuntu 8.04, проц - Athlon 64 X2 4800+

anonymous
()
Ответ на: комментарий от anonymous

Сорри за форматирование, еще разок:

>А вот почему есть в проверке R-1.9.0 и нету к примеру...

Вот, наслаждайтесь:

python2.5.2 fib.py 8,64s user 0,02s system 99% cpu 8,710 total ruby1.9.0 fib.rb 9,03s user 0,02s system 99% cpu 9,064 total python3.0a5 fib.py 10,22s user 0,01s system 99% cpu 10,237 total ruby1.8.7 fib.rb 16,99s user 0,02s system 99% cpu 17,012 total ruby1.8.6 fib.rb 22,12s user 1,72s system 99% cpu 23,842 total

Все собрано под x86_64. Ось - Ubuntu 8.04, проц - Athlon 64 X2 4800+ 

anonymous
()
Ответ на: комментарий от anonymous

Я дико извиняюсь, я не часто здесь пишу, так что вот еще разок:)

>А вот почему есть в проверке R-1.9.0 и нету к примеру...

python2.5.2 fib.py 8,64s user 0,02s system 99% cpu 8,710 total

ruby1.9.0 fib.rb 9,03s user 0,02s system 99% cpu 9,064 total

python3.0a5 fib.py 10,22s user 0,01s system 99% cpu 10,237 total

ruby1.8.7 fib.rb 16,99s user 0,02s system 99% cpu 17,012 total

ruby1.8.6 fib.rb 22,12s user 1,72s system 99% cpu 23,842 total

Все собрано под x86_64. Ось - Ubuntu 8.04, проц - Athlon 64 X2 4800+

anonymous
()
Ответ на: комментарий от anonymous

Дык чо, похоже на правду...
Более того, если руби стремится к увеличению быстродействия, так как все понятно, что пока конкретно в этом его засада, то питон пока об этом меньше думает.

Да и проскакивало же не так давно, что питон 3000 будет совсем не столь быстр как 2.5

anonymous
()

Язык не поворачивается назвать фибоначчи каким бы то ни было тестом, но, тем не менее:

OCaml:
user 0m0.420s

GCC:
user 0m0.412s

seiken ★★★★★
()

Такие вещи на питоне принято писать генераторами. Прошу потестить следующий код и 
выкинуть руби нафиг как тормозное гуано:

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

def getfib(num):
    f = fibonacci()
    for x in xrange(num):
        f.next()

    return f.next()

print getfib(35)

redbaron ★★
()
Ответ на: Re^2: Вышел Ruby 1.8.7 от Voker57

> посасывает питон

посасывают идиоты, которые не знают, как им пользоваться. посмотри выше своего поста, как правильно реализуются подобные вещи на python теми, кто знает толк.

anonymous
()
Ответ на: комментарий от redbaron

> Такие вещи на питоне принято писать генераторами.

я всегда говорил, что знать язык - это не просто уметь деноменировать его до своего уровня, а уметь использовать его правильно.

anonymous
()
Ответ на: комментарий от redbaron

Аналогичный код на Руби:

def fibo(limit)
     i = 1
     a = 1
     b = 1
     while (i < limit-1)
         t = a
         a = a + b
         b = t
         i = i+1
     end
	yield a
end 

fibo(35) {|x| print "#{x}\n" }

$ time ruby1.9 fib.rb
9227465

real    0m0.032s
user    0m0.016s
sys     0m0.000s


Voker57 ★★
()
Ответ на: комментарий от Voker57

Да, питон:

$ time python fib.py
9227465

real    0m0.034s
user    0m0.020s
sys     0m0.004s

Voker57 ★★
()
Ответ на: комментарий от anonymous

Re^2: Вышел Ruby 1.8.7

> и зачем он там вообще, если не в цикле?

Действительно, и без него отлично работает

def fibo(limit)

i = 1

a = 1

b = 1

while (i < limit-1)

t = a

a = a + b

b = t

i = i+1

end

a

end

puts fibo(35)

$ time ruby1.9 fib.rb

9227465

real 0m0.030s

user 0m0.012s

sys 0m0.004s

Сорри, код не мой, выдрал из http://langexplr.blogspot.com/2007/09/rubys-yield-statement.html и упрощал.

Voker57 ★★
()
Ответ на: комментарий от redbaron

> Прошу потестить следующий код и 
выкинуть руби нафиг как тормозное гуано:

Оке, тогда и код на руби переделаем:

def fib(n)
 if n < 2
        n
 else
        a, b, c = 0, 1, 1
        (n - 1).times{ c = a + b; a, b = b, c }
        c
 end
end

puts fib(35)

Итого результаты:
ruby1.8.6 fib2.rb  0,00s user 0,00s system 77% cpu 0,005 total
python2.5.2 fib2.py  0,01s user 0,00s system 95% cpu 0,013 total

Остальные результаты приводить не буду, т.к. 35 считаться слишком быстро, поэтому приведу результаты для числа фибоначи под номером 150000

python2.5.2 fib2.py  1,99s user 0,01s system 98% cpu 2,034 total
ruby1.8.6 fib2.rb  1,52s user 0,04s system 98% cpu 1,592 total
ruby1.8.7 fib2.rb  1,23s user 0,02s system 97% cpu 1,277 total
ruby1.9.0 fib2.rb  6,13s user 0,00s system 98% cpu 6,205 total

На python3.0a5 запустить не получилось =( Я в питоне не силен, но что-то он там на xrange ругается.


anonymous
()
Ответ на: комментарий от anonymous

>python2.5.2 fib2.py 1,99s user 0,01s system 98% cpu 2,034 total
>ruby1.8.6 fib2.rb 1,52s user 0,04s system 98% cpu 1,592 total
>ruby1.8.7 fib2.rb 1,23s user 0,02s system 97% cpu 1,277 total
>ruby1.9.0 fib2.rb 6,13s user 0,00s system 98% cpu 6,205 total

И что, хваленый ruby 1.9.0 слил? o_O странный какой-то тест.

tailgunner ★★★★★
()

Ладно, к не Ъ лоровец не стану брызгать слюной и признаю, что по скорости в этом тесте Ruby равен питону =) 1.9 уж допилят по скорости хотяб до уровня предшестевнника

Т.к. питоном 3000 не располагаю, то просьба потестить мой код и нанём, проблема с xrange решается простой заменой на range

redbaron ★★
()

# fib.rb

def fib(n)
 if n < 2
        n
 else
        a, b, c = 0, 1, 1
        (n - 1).times{ c = a + b; a, b = b, c }
        c
 end
end

fib(370000)
-----------------------
# fib.py

def fib(n):
    a, b = 1, 1
    for i in xrange(n):
        a, b = b, a + b
    return b

fib(370000)
------------------------
user@box:~$ time ruby1.8 fib.rb 

real	0m19.863s
user	0m19.433s
sys	0m0.100s
user@box:~$ time ruby1.9 fib.rb 

real	0m42.242s
user	0m41.779s
sys	0m0.192s
user@box:~$ time python fib.py 

real	0m13.342s
user	0m13.249s
sys	0m0.032s

А еще красоту кода сравните :)

anonymous
()
Ответ на: комментарий от anonymous

>А еще красоту кода сравните :)

Ты дурак или прикидываешься? Твой код вообще не работает, и питон ты не знаешь. О какой красоте может быть речь?

Если отвлечься от правильности работы твоего коды, скажу лишь, что он менее соответствует словесному описанию алгоритма, чем код на руби.

anonymous
()
Ответ на: комментарий от anonymous

ты то точно не прикидываешься..
пусть будет

def fib(n):
    a, b = 0, 1
    for i in xrange(n):
        a, b = b, a + b
    return a

суть от этого не меняется

anonymous
()
Ответ на: комментарий от anonymous

Браво! Только вначале тесть, а потом рассказывай о красоте кода.

def fib(n)
 a, b = 0, 1
 n.times{ a, b = b, a + b }
 return a
end

У мну на одну переменную меньше :-P

anonymous
()

А у меня все равно длинее...

anonymous
()
Ответ на: комментарий от anonymous

Продолжим извращения:

~ > cat b.rb
#!/usr/local/bin/ruby19

require 'matrix'

FIB_MATRIX = Matrix[[1,1],[1,0]]
def fib(n)
(FIB_MATRIX**(n-1))[0,0]
end

fib(370000)


~ > time ./b.rb
real 0m6.634s
user 0m2.401s
sys 0m0.000s

anonymous
()
Ответ на: комментарий от anonymous

Во, оптимальный вариант:

# Ruby 1.9

class Integer
  FibonacciCache = Hash.new do |hash, key|
    if hash.has_key?(key - 1) and hash.has_key?(key - 2)
      hash[key] = hash[key - 1] + hash[key - 2]
    elsif hash.has_key?(key + 1) and hash.has_key?(key + 2)
      hash[key] = hash[key + 2] - hash[key + 1]
    else
      subkey = key.div(2)
      case key.modulo(4)
        when 1
          hash[key] = (2*hash[subkey] + hash[subkey - 1])*(2*hash[subkey] - hash[subkey - 1]) + 2
        when 3
          hash[key] = (2*hash[subkey] + hash[subkey - 1])*(2*hash[subkey] - hash[subkey - 1]) - 2
        else
          hash[key] = hash[subkey] * (hash[subkey] + 2*hash[subkey - 1])
      end
    end
  end
  FibonacciCache[0] = 0
  FibonacciCache[1] = 1

  def fib
    return FibonacciCache[self]
  end

  def fib_uncached
    return FibonacciCache.dup[self]
  end
end

puts 370000.fib.size

################
32112

real    0m0.690s
user    0m0.325s
sys     0m0.000s

anonymous
()
Ответ на: комментарий от anonymous

def fib(n): nums,b,c = [],1,0 while n > 1: if(n&1 == True): nums.append((b,c)) a=b*b b,c,n = a + 2*b*c, a+c*c,n/2 for i in nums: b,c = (b+c)*i[0] + b*i[1], b*i[0] + c*i[1] return b fib(370000)

~ > time real 0m0.775s user 0m0.663s sys 0m0.010s

anonymous
()
Ответ на: комментарий от anonymous

def fib(n):

nums,b,c = [],1,0

while n > 1:

if(n&1 == True): nums.append((b,c))

a=b*b

b,c,n = a + 2*b*c, a+c*c,n/2

for i in nums: b,c = (b+c)*i[0] + b*i[1], b*i[0] + c*i[1]

return b

fib(370000)

-------------------

real 0m0.775s

user 0m0.663s

sys 0m0.010s

--------------------

не знаю, капча stoler должна что-то мне говорить или нет?

anonymous
()

def powLF(n): if n == 1: return (1, 1) L, F = powLF(n//2) L, F = (L**2 + 5*F**2) >> 1, L*F if n & 1: return ((L + 5*F)>>1, (L + F) >>1) else: return (L, F)

def fib(n): if n & 1: return powLF(n)[1] else: L, F = powLF(n // 2) return L * F

fib(370000)

real 0m0.193s user 0m0.176s sys 0m0.008s

anonymous
()

пардон

def powLF(n):
    if n == 1:
        return (1, 1)
    L, F = powLF(n//2)
    L, F = (L**2 + 5*F**2) >> 1, L*F
    if n & 1:
        return ((L + 5*F)>>1, (L + F) >>1)
    else:
        return (L, F)

def fib(n):
    if n & 1:
        return powLF(n)[1]
    else:
        L, F = powLF(n // 2)
        return L * F

fib(370000)

real	0m0.193s
user	0m0.176s
sys	0m0.008s

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.