Skip to content

Instantly share code, notes, and snippets.

@z64
Last active February 19, 2019 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save z64/afa6fee86fdbeb0db67acdf1c727a109 to your computer and use it in GitHub Desktop.
Save z64/afa6fee86fdbeb0db67acdf1c727a109 to your computer and use it in GitHub Desktop.
require "zlib"
require "websocket"
require "benchmark/ips"
@sync_reader = Zlib::Inflate.new
@sync_writer = Zlib::Deflate.new
ZLIB_SUFFIX = "\x00\x00\xFF\xFF".b.freeze
def sync_flush_payload(size)
raw_payload = "a" * size
@sync_writer.deflate(raw_payload, Zlib::SYNC_FLUSH)
end
def inflate_payload(size)
raw_payload = "a" * size
Zlib::Deflate.deflate(raw_payload)
end
def text_frame(size)
data = "a" * size
WebSocket::Frame::Outgoing::Server.new(version: 13, data: data, type: :text).to_s
end
def sync_flush_frame(size)
data = sync_flush_payload(size)
WebSocket::Frame::Outgoing::Server.new(version: 13, data: data, type: :binary).to_s
end
def inflate_frame(size)
data = inflate_payload(size)
WebSocket::Frame::Outgoing::Server.new(version: 13, data: data, type: :binary).to_s
end
sizes = [4_000, 8_000, 16_000]
sizes.each do |size|
Benchmark.ips do |x|
x.report("#{size} text") do
frame = WebSocket::Frame::Incoming::Server.new(version: 13)
frame << text_frame(size)
message = frame.next.to_s
if message.byteslice(0) == 'x'
Zlib::Inflate.inflate(message)
end
end
x.report("#{size} normal inflate") do
frame = WebSocket::Frame::Incoming::Server.new(version: 13)
frame << inflate_frame(size)
message = frame.next.to_s
if message.byteslice(0) == 'x'
Zlib::Inflate.inflate(message)
end
end
x.report("#{size} SYNC_FLUSH inflate") do
frame = WebSocket::Frame::Incoming::Server.new(version: 13)
frame << sync_flush_frame(size)
message = frame.next.to_s
@sync_reader << message
next if message.bytesize < 4 || message.byteslice(-4, 4) != ZLIB_SUFFIX
@sync_reader.inflate('')
end
x.compare!
end
end
@sync_writer.close
@sync_reader.close
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment