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

Add constant for default content_tag_with_haml options #966

Closed
wants to merge 2 commits into from
Closed

Add constant for default content_tag_with_haml options #966

wants to merge 2 commits into from

Conversation

dillonwelch
Copy link
Contributor

This saves an array allocation each time the method is called.

begin
  require "bundler/inline"
rescue LoadError => e
  $stderr.puts "Bundler version 1.10 or later is required. Please update
                your Bundler"
  raise e
end

gemfile(true) do
  source "https://rubygems.org"

  gem "benchmark-ips"
  gem "rails"
end

def allocate_count
  GC.disable
  before = ObjectSpace.count_objects
  yield
  after = ObjectSpace.count_objects
  after.each { |k,v| after[k] = v - before[k] }
  after[:T_HASH] -= 1 # probe effect - we created the before hash.
  GC.enable
  result = after.reject { |k,v| v == 0 }
  GC.start
  result
end

DEFAULT_PRESERVE_OPTIONS = %w(textarea pre code).freeze
@hash = {}

def master_version
  {}.fetch(:preserve, %w(textarea pre code))
end

def fast_version
  {}.fetch(:preserve, DEFAULT_PRESERVE_OPTIONS)
end

puts "master_version"
puts allocate_count { 1000.times { master_version } }
puts "fast_version"
puts allocate_count { 1000.times { fast_version } }

Benchmark.ips do |x|
  x.report("master_version") { master_version }
  x.report("fast_version")     { fast_version }
  x.compare!
end
master_version
{:FREE=>-1812, :T_STRING=>52, :T_ARRAY=>1000, :T_HASH=>1000}
fast_version
{:FREE=>-1001, :T_HASH=>1000}
Warming up --------------------------------------
      master_version   127.040k i/100ms
        fast_version    79.789k i/100ms
Calculating -------------------------------------
      master_version      3.310M (±35.6%) i/s -     13.212M in   5.007796s
        fast_version      5.899M (±19.3%) i/s -     28.166M in   5.016644s

Comparison:
        fast_version:  5899290.2 i/s
      master_version:  3310098.8 i/s - 1.78x  slower

Results of benchmark.rb

                                         Haml |     ERB |  Erubis |
-------------------------------------------------------------------
Cached                                  0.089 |   0.080 |   0.062 |
ActionView                             18.273 |  12.743 |         |
ActionView with deep partials          44.632 |  43.307 |         |

compared to current master:

                                         Haml |     ERB |  Erubis |
-------------------------------------------------------------------
Cached                                  0.174 |   0.420 |   0.224 |
ActionView                             21.360 |  11.631 |         |
ActionView with deep partials          43.563 |  39.238 |         |

dillonwelch and others added 2 commits October 25, 2017 17:18
This saves an array allocation each time the method is called.

```ruby
begin
  require "bundler/inline"
rescue LoadError => e
  $stderr.puts "Bundler version 1.10 or later is required. Please update
                your Bundler"
  raise e
end

gemfile(true) do
  source "https://rubygems.org"

  gem "benchmark-ips"
  gem "rails"
end

def allocate_count
  GC.disable
  before = ObjectSpace.count_objects
  yield
  after = ObjectSpace.count_objects
  after.each { |k,v| after[k] = v - before[k] }
  after[:T_HASH] -= 1 # probe effect - we created the before hash.
  GC.enable
  result = after.reject { |k,v| v == 0 }
  GC.start
  result
end

DEFAULT_PRESERVE_OPTIONS = %w(textarea pre code).freeze
@hash = {}

def master_version
  {}.fetch(:preserve, %w(textarea pre code))
end

def fast_version
  {}.fetch(:preserve, DEFAULT_PRESERVE_OPTIONS)
end

puts "master_version"
puts allocate_count { 1000.times { master_version } }
puts "fast_version"
puts allocate_count { 1000.times { fast_version } }

Benchmark.ips do |x|
  x.report("master_version") { master_version }
  x.report("fast_version")     { fast_version }
  x.compare!
end
```

```ruby
master_version
{:FREE=>-1812, :T_STRING=>52, :T_ARRAY=>1000, :T_HASH=>1000}
fast_version
{:FREE=>-1001, :T_HASH=>1000}
Warming up --------------------------------------
      master_version   127.040k i/100ms
        fast_version    79.789k i/100ms
Calculating -------------------------------------
      master_version      3.310M (±35.6%) i/s -     13.212M in   5.007796s
        fast_version      5.899M (±19.3%) i/s -     28.166M in   5.016644s

Comparison:
        fast_version:  5899290.2 i/s
      master_version:  3310098.8 i/s - 1.78x  slower
```

Results of `benchmark.rb`
```
                                         Haml |     ERB |  Erubis |
-------------------------------------------------------------------
Cached                                  0.089 |   0.080 |   0.062 |
ActionView                             18.273 |  12.743 |         |
ActionView with deep partials          44.632 |  43.307 |         |
```

compared to current master:
```
                                         Haml |     ERB |  Erubis |
-------------------------------------------------------------------
Cached                                  0.174 |   0.420 |   0.224 |
ActionView                             21.360 |  11.631 |         |
ActionView with deep partials          43.563 |  39.238 |         |
```
@amatsuda
Copy link
Member

@oniofchaos Just manually merged this to master. Thanks!

@k0kubun
Copy link
Member

k0kubun commented Oct 26, 2017

👍

netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Mar 24, 2020
Update ruby-haml to 5.1.2.
pkgsrc change: add "USE_LANGUAGES=	# none".


## 5.1.2

Released on August 6, 2019
([diff](haml/haml@v5.1.1...v5.1.2)).

* Fix crash in some environments such as New Relic by unfreezing string literals for ParseNode#inspect. [#1016](haml/haml#1016) (thanks [Jalyna](https://github.com/jalyna))

## 5.1.1

Released on May 25, 2019
([diff](haml/haml@v5.1.0...v5.1.1)).

* Fix NameError bug for that happens on ruby 2.6.1-2.6.3 + haml 5.1.0 + rails 4.2.x + erubi. (Akira Matsuda)

## 5.1.0

Released on May 16, 2019
([diff](haml/haml@v5.0.4...v5.1.0)).

* Rails 6 support [#1008](haml/haml#1008) (thanks [Seb Jacobs](https://github.com/sebjacobs))
* Add `escape_filter_interpolations` option for backwards compatibility with haml 4 defaults [#984](haml/haml#984) (thanks [Will Jordan](https://github.com/wjordan))
* Fix error on empty :javascript and :css filter blocks [#986](haml/haml#986) (thanks [Will Jordan](https://github.com/wjordan))
* Respect changes in Haml::Options.defaults in `Haml::TempleEngine` options (Takashi Kokubun)
* Un-freeze TempleEngine precompiled string literals [#983](haml/haml#983) (thanks [Will Jordan](https://github.com/wjordan))
* Various performance/memory improvements [#965](haml/haml#965), [#966](haml/haml#966), [#963](haml/haml#963) (thanks [Dillon Welch](https://github.com/oniofchaos))
* Enable `frozen_string_literal` magic comment for all .rb files [#967](haml/haml#967) (thanks [Dillon Welch](https://github.com/oniofchaos))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants