Skip to content

Instantly share code, notes, and snippets.

@leandronsp
Last active December 23, 2021 18:05
Show Gist options
  • Save leandronsp/96dabf71a4c495e08d0b6c45b9839ab0 to your computer and use it in GitHub Desktop.
Save leandronsp/96dabf71a4c495e08d0b6c45b9839ab0 to your computer and use it in GitHub Desktop.
Ruby web server - concurrency benchmark
ab -n 20 -c 5
Req per seconds Time per req (ms)
Threads – IO 232 21
Fibers – IO 450 11
Threads – External Req 1.85 2703
Fibers – External Req 7.97 627
require 'socket'
require 'async'
require './web/io-operation-fiber'
reactor = Async::Reactor.new
Fiber.set_scheduler Async::Scheduler.new(reactor)
socket = TCPServer.new(3000)
puts "Listening to the port 3000..."
Fiber.schedule do
loop do
client = socket.accept
request = client.gets
puts "Request: #{request}"
Fiber.schedule do
IOOperationFiber.call
client.puts("HTTP/1.1 200\r\nContent-Type: text/html\r\n\r\nYo!")
client.close
end
end
end
reactor.run
require 'async'
require 'async/barrier'
require 'async/http/internet'
class IOOperationFiber
def self.call
#do_some_io
do_external_request
end
private
def self.do_some_io
20.times do
Fiber.schedule do
sleep 0.0005
end
end
end
def self.do_external_request
internet = Async::HTTP::Internet.new
barrier = Async::Barrier.new
5.times do
barrier.async do
internet.get('https://httpbin.org/json')
end
end
barrier.wait
end
end
require 'net/http'
class IOOperationThreaded
def self.call
do_some_io
#do_external_request
end
private
def self.do_some_io
threads = []
20.times do
threads << Thread.new do
sleep 0.0005
end
end
threads.each(&:join)
end
def self.do_external_request
threads = []
5.times do
threads << Thread.new do
uri = URI('https://httpbin.org/json')
Net::HTTP.get(uri)
end
end
threads.each(&:join)
end
end
require 'socket'
require './web/io-operation-threaded'
socket = TCPServer.new(3000)
puts "Listening to the port 3000..."
loop do
client = socket.accept
request = client.gets
puts "Request: #{request}"
Thread.new do
IOOperationThreaded.call
client.puts("HTTP/1.1 200\r\nContent-Type: text/html\r\n\r\nYo!")
client.close
end.join
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment