Eliminating Intermediate Array Allocations
以下のコードを見たとき、毎回配列を生成するように思えるが、配列を割り当てずに最大値を返せる
code:ruby
def foo(x, y)
end
Arrayオブジェクトを作らずどうしているかというと
x, yをスタックにプッシュする
要素数が2つだと確定してるのスタックから2つの要素をポップしてmax関数を呼ぶ
code:ruby
irb(main):001* def foo(x, y)
irb(main):003> end
=> :foo
irb(main):004> insn = RubyVM::InstructionSequence.of(method(:foo))
irb(main):005> puts insn.disasm
0000 getlocal_WC_0 x@0 ( 2)LiCa 0002 getlocal_WC_0 y@1
0004 opt_newarray_send 2, :max
0007 leave
opt_newarray_send はoptimizeされた呼び出しのための特別な命令
https://www.youtube.com/watch?v=ZE6F3drGhA8