Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Hash#each instead of Hash#inject #1086

Merged
merged 1 commit into from
Jul 6, 2016

Conversation

okkez
Copy link
Contributor

@okkez okkez commented Jul 5, 2016

Because Hash#each is simpler than Hash#inject,
and 20% faster.

Because `Hash#each` is simpler than `Hash#inject`,
and 20% faster.
@okkez
Copy link
Contributor Author

okkez commented Jul 5, 2016

Benchmark script:

require "benchmark"

hash = {
  label00: "value00",
  label01: "value01",
  label02: "value02",
  label03: "value03",
  label04: "value04",
  label05: "value05",
  label06: "value06",
  label07: "value07",
  label08: "value08",
  label09: "value09",
  label10: "value10",
}

N = 100_000

delimiter = "\t"
label_delimiter = ":"


Benchmark.bmbm do |x|
  x.report(:inject) do
    N.times do
      hash.inject("") {|memo, (label, value)|
        memo << delimiter if memo.length.nonzero?
        memo << "#{label}#{label_delimiter}#{value}"
      }
    end
  end
  x.report(:each) do
    N.times do
      formatted = ""
      hash.each do |label, value|
        formatted << delimiter if formatted.length.nonzero?
        formatted << "#{label}#{label_delimiter}#{value}"
      end
    end
  end
end

a = hash.inject("") {|memo, (label, value)|
  memo << delimiter if memo.length.nonzero?
  memo << "#{label}#{label_delimiter}#{value}"
}

formatted = ""
hash.each do |label, value|
  formatted << delimiter if formatted.length.nonzero?
  formatted << "#{label}#{label_delimiter}#{value}"
end

p formatted == a

Result:

Rehearsal ------------------------------------------
inject   0.580000   0.000000   0.580000 (  0.584126)
each     0.470000   0.000000   0.470000 (  0.466243)
--------------------------------- total: 1.050000sec

             user     system      total        real
inject   0.570000   0.000000   0.570000 (  0.568520)
each     0.470000   0.000000   0.470000 (  0.466561)
true

@tagomoris tagomoris added the v0.14 label Jul 6, 2016
@tagomoris
Copy link
Member

LGTM.

@repeatedly repeatedly merged commit c1947d4 into fluent:master Jul 6, 2016
@okkez okkez deleted the use-each-instead-of-inject branch October 24, 2016 00:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants