Есть код по 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-8require '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 изобрел Матц и его комманда? Объясните мне пожалуйста, может я чего не до понимаю?
Фибер - это модный GOTO :)