54 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
require_relative '../../benchmark_helper'
 | 
						|
require 'thread'
 | 
						|
 | 
						|
puts 'Preparing...'
 | 
						|
 | 
						|
xml       = read_big_kaf
 | 
						|
xpath     = 'KAF/terms/term'
 | 
						|
xpath_ast = Oga::XPath::Parser.new(xpath).parse
 | 
						|
output    = Queue.new
 | 
						|
 | 
						|
stop    = false
 | 
						|
threads = []
 | 
						|
 | 
						|
thread_count = ENV['THREADS'] ? ENV['THREADS'].to_i : 5
 | 
						|
sample_size  = ENV['SAMPLES'] ? ENV['SAMPLES'].to_i : 10
 | 
						|
 | 
						|
trap 'INT' do
 | 
						|
  stop = true
 | 
						|
end
 | 
						|
 | 
						|
# Parse these outside of the profiler
 | 
						|
documents = thread_count.times.map { Oga.parse_xml(xml) }
 | 
						|
 | 
						|
puts 'Starting threads...'
 | 
						|
 | 
						|
require 'profile' if ENV['PROFILE']
 | 
						|
 | 
						|
thread_count.times.each do
 | 
						|
  threads << Thread.new do
 | 
						|
    oga_doc   = documents.pop
 | 
						|
    compiler  = Oga::XPath::Compiler.new
 | 
						|
    block     = compiler.compile(xpath_ast)
 | 
						|
 | 
						|
    sample_size.times do
 | 
						|
      break if stop
 | 
						|
 | 
						|
      output << Benchmark.measure { block.call(oga_doc) }
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
threads.each(&:join)
 | 
						|
 | 
						|
samples = []
 | 
						|
 | 
						|
until output.empty?
 | 
						|
  samples << output.pop.real
 | 
						|
end
 | 
						|
 | 
						|
average = samples.inject(:+) / samples.length
 | 
						|
 | 
						|
puts "Samples: #{samples.length}"
 | 
						|
puts "Average: #{average.round(4)} seconds"
 |