unicorn.git  about / heads / tags
Rack HTTP server for Unix and fast clients
blob 9509637598144a100061f400553938886097090e 1082 bytes (raw)
$ git show gperf:test/benchmark/http_parser.rb	# shows this blob on the CLI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
# encoding: binary
# benchmark for HTTP parser hackers:
#   make http && ruby -I lib:ext/unicorn_http test/benchmark/http_parser.rb
require 'unicorn'
require 'optparse'
require 'benchmark'
$stdout.sync = true
extra = []
nr = 100000
op = OptionParser.new("", 24, '  ') do |opts|
  opts.banner = "Usage: #$0"
  opts.separator "#$0 options:"
  # some of these switches exist for rackup command-line compatibility,

  opts.on('-n NUM', Integer, 'number of iterations') { |i| nr = i }
  opts.on('-H HEADER:VALUE', String) { |h| extra << h }
  opts.parse! ARGV
end
extra << '' if extra[0]

payload = <<"".freeze
GET /nowhere HTTP/1.0\r
Host: example.com\r
Accept-Encoding: gzip\r
Accept-Language: en-US\r
User-Agent: curl/7.52.1\r
Accept: */*\r
Referer: https://example.com/eye-kant-spel\r
Cache-Control: max-age=0\r
X-Forwarded-For: 0.6.6.6\r
#{extra.join("\r\n")}\r

hp = Unicorn::HttpParser.new
puts payload.gsub(/^/, '> ')
puts "#{nr} iterations"
res = Benchmark.measure do
  nr.times do
    hp.buf << payload
    hp.parse or abort
    hp.clear
  end
end
puts Benchmark::CAPTION, res

git clone https://yhbt.net/unicorn.git