LINUX.ORG.RU

К Чему изобрели fiber? Глупость ли?


0

1

Есть код по fiber из разных литературных источников:

fib = Fiber.new do
  f1 = f2 = 1
  loop do
    Fiber.yield f1
    f1, f2 = f2, f1 + f2
  end
end
puts "Первые 10 чисел фибоначчи:"
10.times { puts fib.resume }

И вот я написал следующий кусок кода:

f1 = f2 = 1
def fact(f1,f2)
	f1, f2 = f2, f1 + f2
	#puts f1 
	return f1,f2
end
#puts "Первые 10 чисел фибоначчи:"
10.times { f1,f2 = fact(f1,f2) }

А вот все вместе, в тест fiber проигрывает в четыре раза:

# coding: Utf-8

require 'fiber'
require 'benchmark'



Benchmark.bm do |bm|

	bm.report do
		f1 = f2 = 1
		def fact(f1,f2)
			f1, f2 = f2, f1 + f2
			#puts f1 
			return f1,f2
		end

		#puts "Первые 10 чисел фибоначчи:"
		10.times { f1,f2 = fact(f1,f2) }
	end
	
	bm.report do
		fib = Fiber.new do
			f1 = f2 = 1
			loop do
				Fiber.yield f1
				f1, f2 = f2, f1 + f2
			end
		end
		#puts "Первые 10 чисел фибоначчи:"
		10.times { fib.resume }
	end
end
Результаты выполнения:
beerdy@laptop ~/ruby/w/ $ ruby test.rb
       user     system      total        real
   0.000000   0.000000   0.000000 (  0.000025)
   0.000000   0.000000   0.000000 (  0.000102)
beerdy@laptop ~/ruby/w/ $ ruby test.rb
       user     system      total        real
   0.000000   0.000000   0.000000 (  0.000016)
   0.000000   0.000000   0.000000 (  0.000063)
beerdy@laptop ~/ruby/w/ $ ruby test.rb
       user     system      total        real
   0.000000   0.000000   0.000000 (  0.000012)
   0.000000   0.000000   0.000000 (  0.000051)
beerdy@laptop ~/ruby/w/ $ ruby test.rb
       user     system      total        real
   0.000000   0.000000   0.000000 (  0.000012)
   0.000000   0.000000   0.000000 (  0.000051)
Вопрос - Зачем fiber изобрел Матц и его комманда? Объясните мне пожалуйста, может я чего не до понимаю?

Объясните мне пожалуйста, может я чего не до понимаю?

я думаю, что ты чего-то недообъясняешь

reprimand ★★★★★ ()

Твой факт считает каждый раз с начала, а фибер хранит стейт (если это классический фибер/корутина/генератор/лайт-тред). Например можно создать фибер, читающий из потока и контекст-зависимо режущий на токены, а в основном коде дергать его для получения токена, не волоча рядом контекст для обыного токенизера.

arturpub ★★ ()

А, вот, тебя не смущает, что ты пытаешься построить выводы по каким-то бесконечно малым величинам? Какой смысл сравнивать производительность на хелловорлдах,а? Возьми нормально данных, тогда и сравнивай.

ugoday ★★★★★ ()
Ответ на: комментарий от Apple-ch

У новичков короткие вычисления. Увидели знакомые буквы «Ruby» и сразу срабатывает триггер «О, рельсы, веб-дев».

anonymous ()

К теме еще вопросик:

fib = Fiber.new do ||
  sec = 10
  i   = 0
  (sec*10).times { |i|
    i += 1
    sleep 0.1
    # Не вернет так как я понимаю что здесь код будет ждать resume
    Fiber.yeild i/10
  }
  # Тоже не вернет так как будет ждать 10 сек.
  # Fiber.yeild i/10 
end

sleep 3
# Как говориться - Истина гдето рядом) Хотелось бы получить результат: 3 секунды
puts "#{fib.resume} секунды"

Как это можно сделать используя именно Fiber?

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

моя бабушка уманая

Слышь Олень (заметь с большой буквы). Ты б мимо прошел. А то как бабка у подъезда - ничего по делу, а пиздануть что нибудь надо)

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