Sha256: b70a276d36d0b892d1f40b5a2e7bbcb3b8d8bf4f1dd2ae3546073cb495abed62

Contents?: true

Size: 785 Bytes

Versions: 5

Compression:

Stored size: 785 Bytes

Contents

# frozen_string_literal: true

require 'fiber'

class Fiber
  attr_accessor :next
end

# This program shows how the performance of Fiber.transfer degrades as the fiber
# count increases

def run(num_fibers)
  count = 0

  GC.disable

  first = nil
  last = nil
  supervisor = Fiber.current
  num_fibers.times do
    fiber = Fiber.new do
      loop do
        count += 1
        if count == 1_000_000
          supervisor.transfer
        else
          Fiber.current.next.transfer
        end
      end
    end
    first ||= fiber
    last.next = fiber if last
    last = fiber
  end

  last.next = first
  
  t0 = Time.now
  first.transfer
  elapsed = Time.now - t0

  puts "fibers: #{num_fibers} count: #{count} rate: #{count / elapsed}"
  GC.start
end

run(100)
run(1000)
run(10000)

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
polyphony-0.46.0 examples/performance/fiber_transfer.rb
polyphony-0.45.5 examples/performance/fiber_transfer.rb
polyphony-0.45.4 examples/performance/fiber_transfer.rb
polyphony-0.45.2 examples/performance/fiber_transfer.rb
polyphony-0.45.1 examples/performance/fiber_transfer.rb