jekyll / jekyll-avatar

A Jekyll plugin for rendering GitHub avatars
MIT License
89 stars 9 forks source link

Cache parsed host url to reduce allocations #36

Closed ashmaroli closed 5 years ago

ashmaroli commented 5 years ago

Closes #35

Notes

ashmaroli commented 5 years ago

Benchmark script

(to be run on master branch..)

# frozen_string_literal: true

require "benchmark/ips"
require "bundler/setup"
require "jekyll"
require "jekyll-avatar"

def content(tag_name)
  <<~TEXT
    {% #{tag_name} hubot %}

    {% #{tag_name} hubot size=45 %}

    {% #{tag_name} hubot size=80 %}

    {% assign user='hubot-brace' %}{% #{tag_name} {{ user }} %}

    {% assign user='hubot-var' %}{% #{tag_name} user=user %}

    {% #{tag_name} @hubot %}

    {% assign users = "a|b|b|c" | split:"|" %}{% for user in users %}
    {% #{tag_name} user=user %}
    {% endfor %}
  TEXT
end

module Jekyll
  class AvatarNew < Avatar
    def parsed_host
      @parsed_host ||= {}
      @parsed_host[host] ||= Addressable::URI.parse(host)
    end

    def url(scale = 1)
      uri = parsed_host
      uri.path << "/" unless uri.path.end_with?("/")
      uri = uri.join path(scale)
      uri.to_s
    end
  end
end

Liquid::Template.register_tag("avatar_new", Jekyll::AvatarNew)
Benchmark.ips do |x|
  x.report('avatar') { Liquid::Template.parse(content('avatar')).render! }
  x.report('avatar_new') { Liquid::Template.parse(content('avatar_new')).render! }
  x.compare!
end
ashmaroli commented 5 years ago

Wiring in memory_profiler to above yields the following: :tada:

Memory Profiler results for avatar, avatar_new
+------------+---------------+---------------+--------------+--------------+
| Tag Name   | Mem Allocated | Obj Allocated | Mem Retained | Obj Retained |
+------------+---------------+---------------+--------------+--------------+
| avatar     | 497.58 kB     | 5683 objects  |  8.91 kB     | 124 objects  |
| avatar_new | 409.39 kB     | 4774 objects  |  15.74 kB    | 211 objects  |
+------------+---------------+---------------+--------------+--------------+
benbalter commented 5 years ago

Nice! Thanks again @ashmaroli! :smile: