This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/ruby | |
require 'rubygems' | |
require 'bundler/setup' | |
require 'json' | |
require 'pg' | |
require 'benchmark' | |
$obs_tables = ['observation', | |
'observation_history', | |
'observation_references', | |
'observation_search_date', | |
'observation_search_number', | |
'observation_search_quantity', | |
'observation_search_reference', | |
'observation_search_string', | |
'observation_search_token', | |
'observation_sort', | |
'observation_tag', | |
'observation_tag_history'] | |
$conn = PG.connect(dbname: 'fhirbase', | |
user: 'fhirbase', | |
password: 'fhirbase', | |
host: 'localhost', | |
port: 5433) | |
$results = {} | |
$sampling_size = 20 | |
def make_observation(i) | |
@observation ||= JSON.parse(File.read("observation.json")) | |
new_obs = @observation.dup | |
new_obs["valueQuantity"]["value"] = 1 | |
new_obs | |
end | |
def avg(foo) | |
foo.reduce { |acc, i| acc + i }.to_f / foo.size.to_f | |
end | |
def sample_avg(&block) | |
results = [] | |
$sampling_size.times do | |
results << Benchmark.measure(&block).real | |
end | |
avg(results) | |
end | |
def bench(n) | |
puts "Performing stuff with N=#{n}" | |
cfg = { base: "http://localhost.local" } | |
observations_count = $conn.exec("SELECT COUNT(*) FROM observation") | |
.values.first.first.to_i | |
to_create = n - observations_count | |
to_create = 0 if to_create < 0 | |
create_time = Benchmark.measure do | |
puts "Creating #{to_create} observations..." | |
to_create.times do |i| | |
$conn.exec_params("SELECT fhir_create($1::jsonb, $2, $3::jsonb, $4::jsonb)", | |
[JSON.generate(cfg), | |
'Observation', | |
JSON.generate(make_observation(i)), | |
JSON.generate([])]) | |
end | |
$obs_tables.each do |tbl| | |
$conn.exec "VACUUM ANALYZE #{tbl}" | |
end | |
end.real | |
print "Performing search" | |
search_time = sample_avg do | |
$conn.exec_params("SELECT fhir_search($1::jsonb, $2, $3)", | |
[JSON.generate(cfg), | |
'Observation', | |
'value=1']) | |
print "." | |
end | |
print "\n" | |
{create: create_time, search: search_time} | |
end | |
def run_bench(n) | |
$results[n] = bench(n) | |
end | |
run_bench(10) | |
run_bench(20) | |
puts $results.inspect |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment