ruby/benchmark/vm_method_splat_calls2.yml
Alan Wu e4272fd292 Avoid allocation when passing no keywords to anonymous kwrest methods
Thanks to the new semantics from [ruby-core:115808], `**nil` is now
equivalent to `**{}`. Since the only thing one could do with anonymous
keyword rest parameter is to delegate it with `**`, nil is just as good
as an empty hash. Using nil avoids allocating an empty hash.

This is particularly important for `...` methods since they now use
`**kwrest` under the hood after 4f77d8d328. Most calls don't pass
keywords.

    Comparison:
                             fw_no_kw
                    post:   9816800.9 i/s
                     pre:   8570297.0 i/s - 1.15x  slower
2024-02-13 11:05:26 -05:00

27 lines
1.1 KiB
YAML

prelude: |
def named_arg_splat(*a) end
def named_arg_kw_splat(*a, **kw) end
def anon_arg_splat(*) end
def anon_kw_splat(**) end
def anon_arg_kw_splat(*, **) end
def anon_fw_to_named(*, **) named_arg_kw_splat(*, **) end
def fw_to_named(...) named_arg_kw_splat(...) end
def fw_to_anon_to_named(...) anon_fw_to_named(...) end
def fw_no_kw(...) named_arg_splat(...) end
a = [1]
kw = {y: 1}
benchmark:
named_multi_arg_splat: "named_arg_splat(*a, *a)"
named_post_splat: "named_arg_splat(*a, a)"
anon_arg_splat: "anon_arg_splat(*a)"
anon_arg_kw_splat: "anon_arg_kw_splat(*a, **kw)"
anon_multi_arg_splat: "anon_arg_splat(*a, *a)"
anon_post_splat: "anon_arg_splat(*a, a)"
anon_kw_splat: "anon_kw_splat(**kw)"
anon_fw_to_named_splat: "anon_fw_to_named(*a, **kw)"
anon_fw_to_named_no_splat: "anon_fw_to_named(1, y: 1)"
fw_to_named_splat: "fw_to_named(*a, **kw)"
fw_to_named_no_splat: "fw_to_named(1, y: 1)"
fw_to_anon_to_named_splat: "fw_to_anon_to_named(*a, **kw)"
fw_to_anon_to_named_no_splat: "fw_to_anon_to_named(1, y: 1)"
fw_no_kw: "fw_no_kw(1, 2)"