Feature #17291
openOptimize __send__ call
Description
I made a patch to optimize a __send__
call. This optimization replaces a __send__
method call with a call of the method whose name is the first argument of __send__
method. The patch is available in this pull-request.
By this change, the redefined __send__
method is no longer called when it is called by a symbol method name. I guess it is no problem because the following warning message is displayed for a long time.
$ ruby -e 'def __send__; end'
-e:1: warning: redefining `__send__' may cause serious problems
This proposal introduces two new instructions: sendsym
and opt_sendsym_without_block
. These instructions handle the cases that the first argument of __send__
method is not a symbol literal. I think I can combine these two instructions into one if prefered.
This proposal includes the change proposed in #17288. I'll mark it as a duplicate of this proposal.
I don't handle send
method in this proposal. The reason is that we need to examine the redefinition of send
method in the instruction execution time. I want to discuss only __send__
method in this ticket.
The benchmark result is below:
# Iteration per second (i/s)
| |compare-ruby|built-ruby|
|:----------------|-----------:|---------:|
|vm_send_sym | 18.001M| 112.208M|
| | -| 6.23x|
|vm_send_var | 17.779M| 30.922M|
| | -| 1.74x|
|vm_send_var_alt | 3.817M| 6.817M|
| | -| 1.79x|