bin/performance-test
#!/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