From 10142db47f4b03eb00749feda660df567fde7276 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 4 Jul 2019 19:56:38 +0000 Subject: unit benchmark for our HTTP parser Some changes coming to the HTTP parser, so might as well throw some sort of benchmark we can work with to validate improvements. --- test/benchmark/http_parser.rb | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 test/benchmark/http_parser.rb diff --git a/test/benchmark/http_parser.rb b/test/benchmark/http_parser.rb new file mode 100644 index 0000000..9509637 --- /dev/null +++ b/test/benchmark/http_parser.rb @@ -0,0 +1,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 -- cgit v1.2.3-24-ge0c7