bin/benchmark in honey_format-0.11.0 vs bin/benchmark in honey_format-0.12.0
- old
+ new
@@ -2,18 +2,74 @@
require 'bundler/setup'
require 'honey_format'
require 'benchmark/ips'
require 'csv'
+require 'optparse'
-path = ARGV.first || fail(ArgumentError, '<path_to_csv> argument must be provided')
-csv = File.read(path)
+input_path = nil
+benchmark_time = 30
+benchmark_warmup = 5
+lines_multipliers = [1]
-Benchmark.ips do |x|
- x.time = 30
- x.warmup = 5
+OptionParser.new do |parser|
+ parser.banner = "Usage: bin/benchmark [file.csv] [options]"
+ parser.default_argv = ARGV
- x.report('stdlib CSV') { CSV.parse(csv) }
- x.report('HoneyFormat::CSV') { HoneyFormat::CSV.new(csv).rows }
+ parser.on("--csv=file1.csv", String, "CSV file(s)") do |value|
+ input_path = value
+ end
- x.compare!
+ parser.on("--lines-multipliers=[1,10,50]", Array, "Multiply the rows in the CSV file (default: 1)") do |value|
+ lines_multipliers = value.map do |v|
+ Integer(v).tap do |int|
+ unless int >= 1
+ raise(ArgumentError, '--lines-multiplier must be 1 or greater')
+ end
+ end
+ end
+ end
+
+ parser.on("--time=[30]", String, "Benchmark time (default: 30)") do |value|
+ benchmark_time = Integer(value)
+ end
+
+ parser.on("--warmup=[30]", String, "Benchmark warmup (default: 30)") do |value|
+ benchmark_warmup = Integer(value)
+ end
+
+ parser.on("-h", "--help", "How to use") do
+ puts parser
+ exit
+ end
+
+ # No argument, shows at tail. This will print an options summary.
+ parser.on_tail("-h", "--help", "Show this message") do
+ puts parser
+ exit
+ end
+end.parse!
+
+csv = File.read(input_path)
+
+lines_multipliers.each do |lines_multiplier|
+ if lines_multiplier > 1
+ orignial_csv_lines = csv.lines
+ rows = orignial_csv_lines[1..-1] * lines_multiplier
+ csv = orignial_csv_lines.first + rows.join
+ end
+
+ line_count = csv.lines.length
+
+ puts "== [START] Benchmark for #{line_count} lines =="
+ Benchmark.ips do |x|
+ x.time = benchmark_time
+ x.warmup = benchmark_warmup
+
+ x.report('stdlib CSV no options') { CSV.parse(csv) }
+ x.report('stdlib CSV with header') { CSV.parse(csv, headers: true) }
+ x.report('HoneyFormat::CSV') { HoneyFormat::CSV.new(csv).rows }
+
+ x.compare!
+ end
+ puts "== [END] Benchmark for #{line_count} lines =="
end