AK
Size: a a a
AK
VV
w
w
require 'benchmark/ips'
def exit_via_break
5.times do
break
end
end
def exit_via_return
5.times do
return
end
end
Benchmark.ips do |x|
x.report("break") { exit_via_break }
x.report("return") { exit_via_return }
end
w
BB
w
2.7.2 :021 > puts RubyVM::InstructionSequence.disasm(method(:exit_via_return))
== disasm: #<ISeq:exit_via_return@(irb):8 (8,0)-(12,3)> (catch: TRUE)
== catch table
| catch type: break st: 0000 ed: 0005 sp: 0000 cont: 0005
| == disasm: #<ISeq:block in exit_via_return@(irb):9 (9,10)-(11,5)> (catch: TRUE)
| == catch table
| | catch type: redo st: 0001 ed: 0004 sp: 0000 cont: 0001
| | catch type: next st: 0001 ed: 0004 sp: 0000 cont: 0004
| |------------------------------------------------------------------------
| 0000 nop ( 9)[Bc]
| 0001 putnil ( 10)[Li]
| 0002 throw 1
| 0004 nop
| 0005 leave ( 11)[Br]
|------------------------------------------------------------------------
0000 putobject 5 ( 9)[LiCa]
0002 send <calldata!mid:times, argc:0>, block in exit_via_return
0005 nop
0006 leave ( 12)[Re]
=> nil
2.7.2 :022 > puts RubyVM::InstructionSequence.disasm(method(:exit_via_break))
== disasm: #<ISeq:exit_via_break@(irb):3 (3,0)-(7,3)> (catch: TRUE)
== catch table
| catch type: break st: 0000 ed: 0005 sp: 0000 cont: 0005
| == disasm: #<ISeq:block in exit_via_break@(irb):4 (4,10)-(6,5)> (catch: TRUE)
| == catch table
| | catch type: redo st: 0001 ed: 0004 sp: 0000 cont: 0001
| | catch type: next st: 0001 ed: 0004 sp: 0000 cont: 0004
| |------------------------------------------------------------------------
| 0000 nop ( 4)[Bc]
| 0001 putnil ( 5)[Li]
| 0002 throw 2
| 0004 nop
| 0005 leave ( 6)[Br]
|------------------------------------------------------------------------
0000 putobject 5 ( 4)[LiCa]
0002 send <calldata!mid:times, argc:0>, block in exit_via_break
0005 nop
0006 leave
w
w
w
BB
BB
w
w
BB
BB
BB
NB
NB