ledestin/frugal_timeout

View on GitHub
bin/performance-test

Summary

Maintainability
Test Coverage
#!/usr/bin/ruby

$LOAD_PATH << './lib'
require './lib/frugal_timeout'

Thread.abort_on_exception = true
FrugalTimeout.dropin!

THREAD_COUNT, TIMES = 150, 100

def recursive_timeout n, delay
  start = FrugalTimeout::MonotonicTime.now
  timeout(delay) {
    if n > 1
      recursive_timeout n -= 1, delay
    else
      sleep
    end
  }
rescue FrugalTimeout::Error
  finish = FrugalTimeout::MonotonicTime.now
  @m.synchronize { @ar << finish - start - delay }
end

def run is_random
  @ar, @m = [], Mutex.new
  THREAD_COUNT.times {
    Thread.new {
      delay = 0
      until delay > 0
    delay = is_random ? rand(10) : 1
      end
      recursive_timeout TIMES, delay
    }
  }
  sleep 0.1 until @m.synchronize { @ar.size == THREAD_COUNT }
  printf "avg over delay %-14s %s\n", is_random ? '(random)' : '(no random)',
    @ar.inject(:+)/@ar.size
end

puts "#{THREAD_COUNT*TIMES} calls"
run false
run true