mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00

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
27 lines
1.1 KiB
YAML
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)"
|