fastruby / fast-ruby

:dash: Writing Fast Ruby :heart_eyes: -- Collect Common Ruby idioms.
https://github.com/fastruby/fast-ruby
5.67k stars 376 forks source link

`dup`ing an Identity Hash/Set is faster than creating a new one #230

Open amomchilov opened 2 months ago

amomchilov commented 2 months ago

It's one less allocation, too :)

YJIT off YJIT on
Set.new.compare_by_identity 2.571M 4.260M
S.dup 3.014M 4.999M
1.17x 1.17x
YJIT off YJIT on
Hash.new.compare_by_identity 5.643M 8.208M
H.dup 5.988M 9.014M
1.06x 1.09x
S = Set.new.compare_by_identity.freeze
H = Hash.new.compare_by_identity.freeze

Benchmark.ips do |x|
  x.config(time: 10)

  x.report(".new.compare_by_identity") do |times|
    i = 0
    while (i += 1) <= times
      S.dup
    end
  end

  x.report(".dup                    ") do |times|
    i = 0
    while (i += 1) <= times
      Set.new.compare_by_identity
    end
  end

  x.compare!
end

Benchmark.ips do |x|
  x.config(time: 10)

  x.report(".new.compare_by_identity") do |times|
    i = 0
    while (i += 1) <= times
      H.dup
    end
  end

  x.report(".dup                    ") do |times|
    i = 0
    while (i += 1) <= times
      Hash.new.compare_by_identity
    end
  end

  x.compare!
end