1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

benchmark/vm1_*.yml: abstract away the while loop

benchmark/driver.rb had removed the cost for while loop in benchmark/bm_vm1_*.rb,
and benchmark_driver.gem can achieve the same thing with `loop_count`.

But unfortunately current benchmark_driver.gem can't solve it only for vm1_yield.yml...

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63893 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
k0kubun 2018-07-08 16:28:34 +00:00
parent 9e62c93d0d
commit 820ad9cb1d
30 changed files with 242 additions and 336 deletions

View file

@ -73,15 +73,13 @@ loop_count: 1
next if @pattern && /#{@pattern}/ !~ File.basename(file) next if @pattern && /#{@pattern}/ !~ File.basename(file)
next if @exclude && /#{@exclude}/ =~ File.basename(file) next if @exclude && /#{@exclude}/ =~ File.basename(file)
case file case file
when /bm_(vm[12])_/, /bm_loop_(whileloop2?).rb/ when /bm_(vm2)_/, /bm_loop_(whileloop2).rb/
flag[$1] = true flag[$1] = true
end end
file file
}.compact }.compact
if flag['vm1'] && !flag['whileloop'] if flag['vm2'] && !flag['whileloop2']
files << File.join(@dir, 'bm_loop_whileloop.rb')
elsif flag['vm2'] && !flag['whileloop2']
files << File.join(@dir, 'bm_loop_whileloop2.rb') files << File.join(@dir, 'bm_loop_whileloop2.rb')
end end

View file

@ -1,17 +1,14 @@
prelude: |
class C
attr_reader :a, :b
def initialize
@a = nil
@b = nil
end
end
obj = C.new
benchmark: benchmark:
vm1_attr_ivar: | vm1_attr_ivar: |
class C j = obj.a
attr_reader :a, :b k = obj.b
def initialize loop_count: 30000000
@a = nil
@b = nil
end
end
obj = C.new
i = 0
while i<30_000_000 # while loop 1
i += 1
j = obj.a
k = obj.b
end
loop_count: 1

View file

@ -1,17 +1,14 @@
prelude: |
class C
attr_accessor :a, :b
def initialize
@a = nil
@b = nil
end
end
obj = C.new
benchmark: benchmark:
vm1_attr_ivar_set: | vm1_attr_ivar_set: |
class C obj.a = 1
attr_accessor :a, :b obj.b = 2
def initialize loop_count: 30000000
@a = nil
@b = nil
end
end
obj = C.new
i = 0
while i<30_000_000 # while loop 1
i += 1
obj.a = 1
obj.b = 2
end
loop_count: 1

View file

@ -1,13 +1,9 @@
prelude: |
def m
yield
end
benchmark: benchmark:
vm1_block: | vm1_block: |
def m m{
yield }
end loop_count: 30000000
i = 0
while i<30_000_000 # while loop 1
i += 1
m{
}
end
loop_count: 1

View file

@ -1,11 +1,8 @@
prelude: |
def m &b
end
benchmark: benchmark:
vm1_blockparam: | vm1_blockparam: 'm{}
def m &b
end
i = 0 '
while i<30_000_000 # while loop 1 loop_count: 30000000
i += 1
m{}
end
loop_count: 1

View file

@ -1,12 +1,9 @@
prelude: |
def m &b
b.call
end
benchmark: benchmark:
vm1_blockparam_call: | vm1_blockparam_call: 'm{}
def m &b
b.call
end
i = 0 '
while i<30_000_000 # while loop 1 loop_count: 30000000
i += 1
m{}
end
loop_count: 1

View file

@ -1,16 +1,13 @@
prelude: |
def bp_yield
yield
end
def bp_pass &b
bp_yield &b
end
benchmark: benchmark:
vm1_blockparam_pass: | vm1_blockparam_pass: 'bp_pass{}
def bp_yield
yield
end
def bp_pass &b '
bp_yield &b loop_count: 30000000
end
i = 0
while i<30_000_000 # while loop 1
i += 1
bp_pass{}
end
loop_count: 1

View file

@ -1,12 +1,9 @@
prelude: |
def bp_yield &b
yield
end
benchmark: benchmark:
vm1_blockparam_yield: | vm1_blockparam_yield: 'bp_yield{}
def bp_yield &b
yield
end
i = 0 '
while i<30_000_000 # while loop 1 loop_count: 30000000
i += 1
bp_yield{}
end
loop_count: 1

View file

@ -1,11 +1,8 @@
prelude: 'Const = 1
'
benchmark: benchmark:
vm1_const: | vm1_const: |
Const = 1 j = Const
k = Const
i = 0 loop_count: 30000000
while i<30_000_000 # while loop 1
i += 1
j = Const
k = Const
end
loop_count: 1

View file

@ -1,13 +1,9 @@
benchmark: benchmark:
vm1_ensure: | vm1_ensure: |
i = 0 begin
while i<30_000_000 # benchmark loop 1
i += 1
begin begin
begin
ensure
end
ensure ensure
end end
ensure
end end
loop_count: 1 loop_count: 30000000

View file

@ -1,10 +1,8 @@
prelude: |
f = 0.0
benchmark: benchmark:
vm1_float_simple: | vm1_float_simple: |
i = 0.0; f = 0.0 f += 0.1; f -= 0.1
while i<30_000_000 f += 0.1; f -= 0.1
i += 1 f += 0.1; f -= 0.1
f += 0.1; f -= 0.1 loop_count: 30000000
f += 0.1; f -= 0.1
f += 0.1; f -= 0.1
end
loop_count: 1

View file

@ -1,13 +1,9 @@
benchmark: benchmark:
vm1_gc_short_lived: | vm1_gc_short_lived: |
i = 0 a = '' # short-lived String
while i<30_000_000 # while loop 1 b = ''
a = '' # short-lived String c = ''
b = '' d = ''
c = '' e = ''
d = '' f = ''
e = '' loop_count: 30000000
f = ''
i+=1
end
loop_count: 1

View file

@ -1,29 +1,25 @@
prelude: |
def nested_hash h, n
if n == 0
''
else
10.times{
h[Object.new] = nested_hash(h, n-1)
}
end
end
long_lived = Hash.new
nested_hash long_lived, 6
GC.start
GC.start
benchmark: benchmark:
vm1_gc_short_with_complex_long: | vm1_gc_short_with_complex_long: |
def nested_hash h, n a = '' # short-lived String
if n == 0 b = ''
'' c = ''
else d = ''
10.times{ e = ''
h[Object.new] = nested_hash(h, n-1) f = ''
} loop_count: 30000000
end
end
long_lived = Hash.new
nested_hash long_lived, 6
GC.start
GC.start
i = 0
while i<30_000_000 # while loop 1
a = '' # short-lived String
b = ''
c = ''
d = ''
e = ''
f = ''
i+=1
end
loop_count: 1

View file

@ -1,16 +1,13 @@
prelude: |
long_lived = Array.new(1_000_000){|i| "#{i}"}
GC.start
GC.start
benchmark: benchmark:
vm1_gc_short_with_long: | vm1_gc_short_with_long: |
long_lived = Array.new(1_000_000){|i| "#{i}"} a = '' # short-lived String
GC.start b = ''
GC.start c = ''
i = 0 d = ''
while i<30_000_000 # while loop 1 e = ''
a = '' # short-lived String f = ''
b = '' loop_count: 30000000
c = ''
d = ''
e = ''
f = ''
i+=1
end
loop_count: 1

View file

@ -1,19 +1,13 @@
prelude: | prelude: |
# make many symbols 50_000.times{|i| sym = "sym#{i}".to_sym}
GC.start
GC.start
benchmark: benchmark:
vm1_gc_short_with_symbol: | vm1_gc_short_with_symbol: |
50_000.times{|i| sym = "sym#{i}".to_sym} a = '' # short-lived String
GC.start b = ''
GC.start c = ''
d = ''
i = 0 e = ''
while i<30_000_000 # while loop 1 f = ''
a = '' # short-lived String loop_count: 30000000
b = ''
c = ''
d = ''
e = ''
f = ''
i+=1
end
loop_count: 1

View file

@ -1,15 +1,12 @@
prelude: |
short_lived_ary = []
if RUBY_VERSION >= "2.2.0"
GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true)
end
short_lived = ''
benchmark: benchmark:
vm1_gc_wb_ary: | vm1_gc_wb_ary: |
short_lived_ary = [] short_lived_ary[0] = short_lived # write barrier
loop_count: 30000000
if RUBY_VERSION >= "2.2.0"
GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true)
end
i = 0
short_lived = ''
while i<30_000_000 # while loop 1
short_lived_ary[0] = short_lived # write barrier
i+=1
end
loop_count: 1

View file

@ -1,17 +1,15 @@
prelude: |
long_lived = []
if RUBY_VERSION > "2.2.0"
3.times{ GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true) }
elsif
GC.start
end
short_lived = ''
benchmark: benchmark:
vm1_gc_wb_ary_promoted: | vm1_gc_wb_ary_promoted: |
long_lived = [] long_lived[0] = short_lived # write barrier
loop_count: 30000000
if RUBY_VERSION > "2.2.0"
3.times{ GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true) }
elsif
GC.start
end
i = 0
short_lived = ''
while i<30_000_000 # while loop 1
long_lived[0] = short_lived # write barrier
i+=1
end
loop_count: 1

View file

@ -1,18 +1,15 @@
prelude: |
class C
attr_accessor :foo
end
short_lived_obj = C.new
if RUBY_VERSION >= "2.2.0"
GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true)
end
short_lived = ''
benchmark: benchmark:
vm1_gc_wb_obj: | vm1_gc_wb_obj: |
class C short_lived_obj.foo = short_lived # write barrier
attr_accessor :foo loop_count: 30000000
end
short_lived_obj = C.new
if RUBY_VERSION >= "2.2.0"
GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true)
end
i = 0
short_lived = ''
while i<30_000_000 # while loop 1
short_lived_obj.foo = short_lived # write barrier
i+=1
end
loop_count: 1

View file

@ -1,20 +1,17 @@
prelude: |
class C
attr_accessor :foo
end
long_lived = C.new
if RUBY_VERSION >= "2.2.0"
3.times{ GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true) }
elsif
GC.start
end
short_lived = ''
benchmark: benchmark:
vm1_gc_wb_obj_promoted: | vm1_gc_wb_obj_promoted: |
class C long_lived.foo = short_lived # write barrier
attr_accessor :foo loop_count: 30000000
end
long_lived = C.new
if RUBY_VERSION >= "2.2.0"
3.times{ GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true) }
elsif
GC.start
end
i = 0
short_lived = ''
while i<30_000_000 # while loop 1
long_lived.foo = short_lived # write barrier
i+=1
end
loop_count: 1

View file

@ -1,11 +1,6 @@
prelude: "@a = 1\n"
benchmark: benchmark:
vm1_ivar: | vm1_ivar: |
@a = 1 j = @a
k = @a
i = 0 loop_count: 30000000
while i<30_000_000 # while loop 1
i += 1
j = @a
k = @a
end
loop_count: 1

View file

@ -1,9 +1,5 @@
benchmark: benchmark:
vm1_ivar_set: | vm1_ivar_set: |
i = 0 @a = 1
while i<30_000_000 # while loop 1 @b = 2
i += 1 loop_count: 30000000
@a = 1
@b = 2
end
loop_count: 1

View file

@ -1,11 +1,8 @@
prelude: |
a = 'abc'
b = [1, 2, 3]
benchmark: benchmark:
vm1_length: | vm1_length: |
a = 'abc' a.length
b = [1, 2, 3] b.length
i = 0 loop_count: 30000000
while i<30_000_000 # while loop 1
i += 1
a.length
b.length
end
loop_count: 1

View file

@ -1,20 +1,16 @@
prelude: |
def m v
unless v
# unreachable code
v1 = v2 = v3 = v4 = v5 = v6 = v7 = v8 = v9 = v10 =
v11 = v12 = v13 = v14 = v15 = v16 = v17 = v18 = v19 = v20 =
v21 = v22 = v23 = v24 = v25 = v26 = v27 = v28 = v29 = v30 =
v31 = v32 = v33 = v34 = v35 = v36 = v37 = v38 = v39 = v40 =
v41 = v42 = v43 = v44 = v45 = v46 = v47 = v48 = v49 = v50 = 1
end
end
benchmark: benchmark:
vm1_lvar_init: | vm1_lvar_init: 'm i
def m v
unless v
# unreachable code
v1 = v2 = v3 = v4 = v5 = v6 = v7 = v8 = v9 = v10 =
v11 = v12 = v13 = v14 = v15 = v16 = v17 = v18 = v19 = v20 =
v21 = v22 = v23 = v24 = v25 = v26 = v27 = v28 = v29 = v30 =
v31 = v32 = v33 = v34 = v35 = v36 = v37 = v38 = v39 = v40 =
v41 = v42 = v43 = v44 = v45 = v46 = v47 = v48 = v49 = v50 = 1
end
end
i = 0 '
loop_count: 30000000
while i<30_000_000 # while loop 1
i += 1
m i
end
loop_count: 1

View file

@ -1,8 +1,6 @@
benchmark: benchmark:
vm1_lvar_set: | vm1_lvar_set: 'a = b = c = d = e = f = g = h = j = k = l = m = n = o = p = q = r
i = 0 = 1
while i<30_000_000 # while loop 1
i += 1 '
a = b = c = d = e = f = g = h = j = k = l = m = n = o = p = q = r = 1 loop_count: 30000000
end
loop_count: 1

View file

@ -1,11 +1,7 @@
prelude: |
obj1 = Object.new
obj2 = Object.new
benchmark: benchmark:
vm1_neq: | vm1_neq: |
i = 0 obj1 != obj2
obj1 = Object.new loop_count: 30000000
obj2 = Object.new
while i<30_000_000 # while loop 1
i += 1
obj1 != obj2
end
loop_count: 1

View file

@ -1,10 +1,6 @@
prelude: |
obj = Object.new
benchmark: benchmark:
vm1_not: | vm1_not: |
i = 0 !obj
obj = Object.new loop_count: 30000000
while i<30_000_000 # while loop 1
i += 1
!obj
end
loop_count: 1

View file

@ -1,10 +1,6 @@
benchmark: benchmark:
vm1_rescue: | vm1_rescue: |
i = 0 begin
while i<30_000_000 # while loop 1 rescue
i += 1
begin
rescue
end
end end
loop_count: 1 loop_count: 30000000

View file

@ -1,11 +1,9 @@
prelude: |
def m
return 1
end
benchmark: benchmark:
vm1_simplereturn: | vm1_simplereturn: 'm
def m
return 1 '
end loop_count: 30000000
i = 0
while i<30_000_000 # while loop 1
i += 1
m
end
loop_count: 1

View file

@ -1,10 +1,8 @@
prelude: |
a = 1
b = 2
benchmark: benchmark:
vm1_swap: | vm1_swap: 'a, b = b, a
a = 1
b = 2 '
i = 0 loop_count: 30000000
while i<30_000_000 # while loop 1
i += 1
a, b = b, a
end
loop_count: 1

View file

@ -1,8 +1,9 @@
# while loop cost is not removed due to benchmark_driver.gem's limitation
benchmark: benchmark:
vm1_yield: | vm1_yield: |
def m def m
i = 0 i = 0
while i<30_000_000 # while loop 1 while i<30_000_000
i += 1 i += 1
yield yield
end end