Project

General

Profile

Actions

Feature #17758

open

Provide Hash#count for performance improvement

Added by kachick (Kenichi Kamiya) 6 months ago. Updated 6 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:103076]

Description

GH-PR: https://github.com/ruby/ruby/pull/4333

In my experience, many developers choice size, length and count as a matter of taste.
And Ruby already provide Array#count for performance improvement reason since https://github.com/ruby/ruby/commit/921fb6ae2593d07d35df0f1f487b9d64a0db9520

So how about to provide simple bridge implementation into Hash?

I have checked the result with benchmark-driver, it looks made faster for no arguments pattern, and does not make much slower other arguments pattern.
It is compared with recently code https://github.com/ruby/ruby/tree/989e22f394c48aae301a0239cad14871dfa96d43.

$ /Users/kachick/.rubies/ruby-3.1.0dev-989e22f394/bin/ruby -v
ruby 3.1.0dev (2021-03-28T14:42:38Z master 989e22f394) [x86_64-darwin20]

$ ./ruby -v
ruby 3.1.0dev (2021-03-28T17:45:56Z hash-count 94b052d7fa) [x86_64-darwin20]

$ benchmark-driver benchmark/hash_count.yml -e /Users/kachick/.rubies/ruby-3.1.0dev-989e22f394/bin/ruby -e ./ruby

Warming up --------------------------------------
               count                                                   94.814 i/s -     100.000 times in 1.054702s (10.55ms/i)
      count_with_arg                                                   17.106 i/s -      18.000 times in 1.052250s (58.46ms/i)
    count_with_block                                                   54.992 i/s -      60.000 times in 1.091072s (18.18ms/i)
Calculating -------------------------------------
                     /Users/kachick/.rubies/ruby-3.1.0dev-989e22f394/bin/ruby      ./ruby 
               count                                                   92.080     40.571M i/s -     284.000 times in 3.084282s 0.000007s
      count_with_arg                                                   20.483      20.571 i/s -      51.000 times in 2.489822s 2.479206s
    count_with_block                                                   56.792      54.271 i/s -     164.000 times in 2.887742s 3.021896s

Comparison:
                            count
              ./ruby:  40571119.6 i/s 
/Users/kachick/.rubies/ruby-3.1.0dev-989e22f394/bin/ruby:        92.1 i/s - 440608.36x  slower

                   count_with_arg
              ./ruby:        20.6 i/s 
/Users/kachick/.rubies/ruby-3.1.0dev-989e22f394/bin/ruby:        20.5 i/s - 1.00x  slower

                 count_with_block
/Users/kachick/.rubies/ruby-3.1.0dev-989e22f394/bin/ruby:        56.8 i/s 
              ./ruby:        54.3 i/s - 1.05x  slower

How do you think?

Actions

Also available in: Atom PDF