Class: SeqParBenchmark
- Defined in:
- lib/vendor/treetop/benchmark/seqpar_benchmark.rb
Constant Summary collapse
- OPERATORS =
["seq", "fit", "art"*5, "par", "sequence"]
Instance Method Summary collapse
-
#benchmark ⇒ Object
Launches benchmarking.
-
#check ⇒ Object
Checks the grammar.
-
#generate(depth = 0) ⇒ Object
Generates an input text.
-
#initialize ⇒ SeqParBenchmark
constructor
Loads the grammar and returns a parser.
Constructor Details
#initialize ⇒ SeqParBenchmark
Loads the grammar and returns a parser
24 25 26 27 28 29 30 31 32 33 |
# File 'lib/vendor/treetop/benchmark/seqpar_benchmark.rb', line 24 def initialize compiler = Treetop::Compiler::GrammarCompiler.new @where = File.(File.dirname(__FILE__)) grammar = File.join(@where, 'seqpar.treetop') output = File.join(@where, 'seqpar.rb') compiler.compile(grammar, output) load output File.delete(output) @parser = SeqParParser.new end |
Instance Method Details
#benchmark ⇒ Object
Launches benchmarking
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/vendor/treetop/benchmark/seqpar_benchmark.rb', line 69 def benchmark number_by_size = Hash.new {|h,k| h[k] = 0} time_by_size = Hash.new {|h,k| h[k] = 0} 0.upto(250) do |i| input = generate length = input.length puts "Launching #{i}: #{input.length}" # puts input tms = Benchmark.measure { @parser.parse(input) } number_by_size[length] += 1 time_by_size[length] += tms.total*1000 end # puts number_by_size.inspect # puts time_by_size.inspect File.open(File.join(@where, 'after.dat'), 'w') do |dat| number_by_size.keys.sort.each do |size| dat << "#{size} #{(time_by_size[size]/number_by_size[size]).truncate}\n" end end if File.exists?(File.join(@where, 'before.dat')) before = {} performance_increases = [] File.foreach(File.join(@where, 'before.dat')) do |line| size, time = line.split(' ') before[size] = time end File.foreach(File.join(@where, 'after.dat')) do |line| size, time = line.split(' ') performance_increases << (before[size].to_f - time.to_f) / before[size].to_f unless time == "0" end puts "Average performance increase: #{performance_increases.mean * 100}%" end end |
#check ⇒ Object
Checks the grammar
36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/vendor/treetop/benchmark/seqpar_benchmark.rb', line 36 def check ["Task", "seq Task end", "par Task end", "seq Task Task end", "par Task Task end", "par seq Task end Task end", "par seq seq Task end end Task end", "seq Task par seq Task end Task end Task end"].each do |input| raise ParseError.new(@parser) if @parser.parse(input).nil? end end |
#generate(depth = 0) ⇒ Object
Generates an input text
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/vendor/treetop/benchmark/seqpar_benchmark.rb', line 50 def generate(depth=0) return "Task" if depth>7 return "seq #{generate(depth+1)} end" if depth==0 which = rand(OPERATORS.length) case which when 0 "Task" else raise unless OPERATORS[which] buffer = "#{OPERATORS[which]} " 0.upto(rand(4)+1) do buffer << generate(depth+1) << " " end buffer << "end" buffer end end |