mirror of
https://github.com/kemko/liquid.git
synced 2026-01-06 02:05:41 +03:00
Reduce allocations in truncatewords
I don't know if this is a bottleneck IRL, but while doing some
performance testing I noticed that this method allocates a bunch of
objects and I decided to fix it.
Here is the benchmark I used:
```ruby
require_relative 'theme_runner'
Liquid::Template.error_mode = ARGV.first.to_sym if ARGV.first
profiler = ThemeRunner.new
def count_alloc
before = GC.stat(:total_allocated_objects)
yield
GC.stat(:total_allocated_objects) - before
end
profiler.render # heat
p count_alloc { profiler.render }
p count_alloc { profiler.render }
p count_alloc { profiler.render }
```
Before this change:
```
[aaron@tc-lan-adapter ~/g/liquid (master)]$ ruby -I lib performance/run_once.rb
15753
15750
15752
```
After this change:
```
[aaron@tc-lan-adapter ~/g/liquid (master)]$ ruby -I lib performance/run_once.rb
14015
14010
14011
```
About an 11% reduction in allocations for this test. I also added some
tests around the current behavior of the method so we can be more sure
the replacement behaves the same way
This commit is contained in:
@@ -168,6 +168,8 @@ class StandardFiltersTest < Minitest::Test
|
||||
def test_truncatewords
|
||||
assert_equal('one two three', @filters.truncatewords('one two three', 4))
|
||||
assert_equal('one two...', @filters.truncatewords('one two three', 2))
|
||||
assert_equal('one two...', @filters.truncatewords('one two three', 2))
|
||||
assert_equal('one two...', @filters.truncatewords(' one two three', 2))
|
||||
assert_equal('one two three', @filters.truncatewords('one two three'))
|
||||
assert_equal(
|
||||
'Two small (13” x 5.5” x 10” high) baskets fit inside one large basket (13”...',
|
||||
@@ -175,6 +177,8 @@ class StandardFiltersTest < Minitest::Test
|
||||
)
|
||||
assert_equal("测试测试测试测试", @filters.truncatewords('测试测试测试测试', 5))
|
||||
assert_equal('one two1', @filters.truncatewords("one two three", 2, 1))
|
||||
assert_equal('one1', @filters.truncatewords("one two three", 0, 1))
|
||||
assert_equal('one1', @filters.truncatewords("one two three", -1, 1))
|
||||
end
|
||||
|
||||
def test_strip_html
|
||||
|
||||
Reference in New Issue
Block a user