etehtsea/oxblood

View on GitHub
benchmarks/pool.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'concurrent'
require 'redis'
require 'oxblood'
require 'benchmark'

N = 5_000
TASKS = 1_000
POOL_SIZE = Concurrent.processor_count + 1

Concurrent.use_stdlib_logger(Logger::DEBUG)

def worker_pool
  Concurrent::FixedThreadPool.new(POOL_SIZE)
end

RedisPool = ConnectionPool.new(size: POOL_SIZE) { Redis.new(driver: :ruby) }
OxbloodPool = Oxblood::Pool.new(size: POOL_SIZE)

def benchmark(label, &blk)
  sec = Benchmark.realtime(&blk)
  puts [label, sec.round(3)].join(': ')
end

def run(name, &blk)
  puts "Running #{name}"

  pool = worker_pool
  TASKS.times { pool.post(&blk) }
  sleep 0.1 while pool.scheduled_task_count != TASKS
  pool.shutdown
  pool.wait_for_termination
  puts "#{pool.completed_task_count} tasks finished successfully"
end

def redis
  RedisPool.with do |r|
    r.pipelined do
      N.times { r.ping }
    end
  end
end

def oxblood
  OxbloodPool.with do |s|
    s.pipelined do |p|
      N.times { p.ping }
    end
  end
end

# Check that everything is working
redis
oxblood

# Warmup JVM
if RUBY_ENGINE == 'jruby'
  10.times do
    redis
    oxblood
  end
end

benchmark('redis-rb') { run('redis-rb') { redis } }
benchmark('oxblood') { run('oxblood') { oxblood } }