benchmark/markdown.rb (61 lines of code) (raw):
#!/usr/bin/env ruby
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
require "csv"
benchmarks = [
"integer",
"string",
]
types = [
"select",
"insert",
]
def format_n_records(n_records)
if n_records < 1_000_000
"%dK" % (n_records / 1_000.0)
else n_records
"%dM" % (n_records / 1_000_000.0)
end
end
benchmarks.each do |benchmark|
base_dir = File.join(__dir__, benchmark)
readme_path = File.join(base_dir, "README.md")
results_header = "## Results"
readme = File.read(readme_path)
readme_before_results_header =
readme.split(/^#{Regexp.escape(results_header)}$/, 2)[0]
results = ""
types.each do |type|
results << "### `#{type.upcase}`\n"
results << "\n"
results << ""
results << "\n"
data = CSV.read(File.join(base_dir, "#{type}.csv"),
headers: true,
converters: :all)
records_per_n = data.each.group_by do |row|
row["N records"]
end
records_per_n.each do |n_records, rows|
results << "\n"
results << "#{format_n_records(n_records)} records:\n"
results << "\n"
approaches = rows.collect do |row|
approach = row["Approach"]
if approach == "Apache Arrow Flight SQL"
approach
else
"`#{approach}`"
end
end
results << ("| " + approaches.join(" | ") + " |\n")
separators = approaches.collect {|approach| "-" * approach.size}
results << ("| " + separators.join(" | ") + " |\n")
formatted_elapsed = approaches.zip(rows).collect do |approach, row|
width = approach.size
("%.3f" % row["Elapsed time (sec)"]).ljust(width)
end
results << ("| " + formatted_elapsed.join(" | ") + " |\n")
end
results << "\n"
end
File.write(readme_path, <<-README)
#{readme_before_results_header.strip}
#{results_header}
#{results.strip}
README
end