From: "byroot (Jean Boussier) via ruby-core" <ruby-core@...>
Date: 2023-05-23T10:44:18+00:00
Subject: [ruby-core:113598] [Ruby master Feature#19236] Allow to create hashes with a specific capacity from Ruby

Issue #19236 has been updated by byroot (Jean Boussier).


Correction:

> In 3.3 it throws error all keyword arguments to Hash.new. 

Was a misunderstanding. 

What was actually agreed was a deprecation warning, I modified the pull request accordingly.

----------------------------------------
Feature #19236: Allow to create hashes with a specific capacity from Ruby
https://bugs.ruby-lang.org/issues/19236#change-103238

* Author: byroot (Jean Boussier)
* Status: Open
* Priority: Normal
* Target version: 3.3
----------------------------------------
Followup on [Feature #18683] which added a C-API for this purpose.

Various protocol parsers such as Redis `RESP3` or `msgpack`, have to create hashes, and they know the size in advance.
For efficiency, it would be preferable if they could directly allocate a Hash of the necessary size, so that large hashes wouldn't cause many re-alloccations and re-hash.

`String` and `Array` both already offer similar APIs:

```ruby
String.new(capacity: XXX)
Array.new(XX) / rb_ary_new_capa(long)
```

However there's no such public API for Hashes in Ruby land.

### Proposal

I think `Hash` should have a way to create a new hash with a `capacity` parameter.


The logical signature of `Hash.new(capacity: 1000)` was deemed too incompatible in [Feature #18683].


@Eregon proposed to add `Hash.create(capacity: 1000)`.





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/