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"
 |