This repository has been archived on 2023-07-01. You can view files and clone it, but cannot push or open issues or pull requests.
mastodon/app
David Yip 693c66dfde Use more idiomatic string concatentation. #164.
The intent of the previous concatenation was to minimize object
allocations, which can end up being a slow killer.  However, it turns
out that under MRI 2.4.x, the shove-strings-in-an-array-and-join method
is not only arguably more common but (in this particular case) actually
allocates *fewer* objects than the string concatenation.

Or, at least, that's what I gather by running this:

    words = %w(palmettoes nudged hibernation bullish stockade's tightened Hades
    Dixie's formalize superego's commissaries Zappa's viceroy's apothecaries
    tablespoonful's barons Chennai tollgate ticked expands)

    a = Account.first

    KeywordMute.transaction do
      words.each { |w| KeywordMute.create!(keyword: w, account: a) }

      GC.start

      s1 = GC.stat

      re = String.new.tap do |str|
        scoped = KeywordMute.where(account: a)
        keywords = scoped.select(:id, :keyword)
        count = scoped.count

        keywords.find_each.with_index do |kw, index|
          str << Regexp.escape(kw.keyword.strip)
          str << '|' if index < count - 1
        end
      end

      s2 = GC.stat

      puts s1.inspect, s2.inspect

      raise ActiveRecord::Rollback
    end

vs this:

    words = %w( palmettoes nudged hibernation bullish stockade's tightened Hades Dixie's
    formalize superego's commissaries Zappa's viceroy's apothecaries tablespoonful's
    barons Chennai tollgate ticked expands
    )

    a = Account.first

    KeywordMute.transaction do
      words.each { |w| KeywordMute.create!(keyword: w, account: a) }

      GC.start

      s1 = GC.stat

      re = [].tap do |arr|
        KeywordMute.where(account: a).select(:keyword, :id).find_each do |m|
          arr << Regexp.escape(m.keyword.strip)
        end
      end.join('|')

      s2 = GC.stat

      puts s1.inspect, s2.inspect

      raise ActiveRecord::Rollback
    end

Using rails r, here is a comparison of the total_allocated_objects and
malloc_increase_bytes GC stat data:

                 total_allocated_objects        malloc_increase_bytes
string concat    3200241 -> 3201428 (+1187)     1176 -> 45216 (44040)
array join       3200380 -> 3201299 (+919)      1176 -> 36448 (35272)
2017-10-21 14:54:36 -05:00
..
controllers Merge remote-tracking branch 'upstream/master' into gs-master 2017-10-16 09:23:59 -05:00
helpers Swedish translation (#5406) 2017-10-17 13:41:36 +09:00
javascript Compose buttons bar redesign + generalize dropdown (#194) 2017-10-21 20:24:53 +02:00
lib Rework KeywordMute interface to use a matcher object; spec out matcher. #164. 2017-10-21 14:54:36 -05:00
mailers Supply @instance variable in password reset instructions / password change mailer (#5215) 2017-10-04 13:25:24 +02:00
models Use more idiomatic string concatentation. #164. 2017-10-21 14:54:36 -05:00
policies try to tighten up local only toot stuff, like... properly (#163) 2017-10-09 09:56:17 -04:00
presenters Merge commit 'b9f59ebcc68e9da0a7158741a1a2ef3564e1321e' into merging-upstream 2017-09-28 09:18:35 +02:00
serializers Merge remote-tracking branch 'upstream/master' into gs-master 2017-10-16 09:23:59 -05:00
services Merge tag 'v2.0.0' into gs-master 2017-10-18 11:52:04 -05:00
validators Merge upstream 2.0ish #165 2017-10-11 10:43:10 -07:00
views Merge tag 'v2.0.0' into gs-master 2017-10-18 11:52:04 -05:00
workers Clean up reblog tracking keys, related improvements (#5428) 2017-10-17 11:45:06 +02:00