forked from jruby/jruby
-
Notifications
You must be signed in to change notification settings - Fork 1
/
bench_method_dispatch.rb
78 lines (67 loc) · 2.32 KB
/
bench_method_dispatch.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
require 'jruby'
require 'benchmark'
StandardASMCompiler = org.jruby.compiler.impl.StandardASMCompiler
NodeCompilerFactory = org.jruby.compiler.NodeCompilerFactory
control_code = <<EOS
def control
a = 5;
i = 0;
while i < 100000
a; a; a; a; a; a; a; a; a; a;
a; a; a; a; a; a; a; a; a; a;
a; a; a; a; a; a; a; a; a; a;
a; a; a; a; a; a; a; a; a; a;
a; a; a; a; a; a; a; a; a; a;
a; a; a; a; a; a; a; a; a; a;
a; a; a; a; a; a; a; a; a; a;
a; a; a; a; a; a; a; a; a; a;
a; a; a; a; a; a; a; a; a; a;
a; a; a; a; a; a; a; a; a; a;
i = i + 1;
end
end
EOS
test_code = <<EOS
def test
a = 5;
i = 0;
while i < 100000
a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i;
a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i;
a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i;
a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i;
a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i;
a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i;
a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i;
a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i;
a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i;
a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i; a.to_i;
i = i + 1;
end
end
EOS
control_node = JRuby.parse(control_code, "EVAL")
test_node = JRuby.parse(test_code, "EVAL")
def compile_to_class(node)
context = StandardASMCompiler.new(node)
NodeCompilerFactory.getCompiler(node).compile(node, context)
context.loadClass(JRuby.runtime)
end
def compile_and_run(node)
cls = compile_to_class(node)
cls.new_instance.run(JRuby.runtime.current_context, JRuby.runtime.top_self, nil, nil)
end
compile_and_run(control_node)
compile_and_run(test_node)
puts "Control"
puts Benchmark.measure { control }
puts Benchmark.measure { control }
puts Benchmark.measure { control }
puts Benchmark.measure { control }
puts Benchmark.measure { control }
puts "Test"
puts Benchmark.measure { test }
puts Benchmark.measure { test }
puts Benchmark.measure { test }
puts Benchmark.measure { test }
puts Benchmark.measure { test }