mastodon/app/models
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
..
concerns Merge commit '4aea3f88a6d30f102a79c2da7fcfac96465ba1a8' into merging-upstream 2017-09-28 09:12:17 +02:00
form Default follows for new users (#4871) 2017-09-10 09:58:38 +02:00
web Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
account.rb Merge upstream 2.0ish #165 2017-10-11 10:43:10 -07:00
account_domain_block.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
account_filter.rb Improve admin UI for custom emojis, add copy/disable/enable (#5231) 2017-10-05 23:42:05 +02:00
account_moderation_note.rb foreign_key, non-nullable, dependent: destroy in account_moderation_notes (#5294) 2017-10-10 13:12:17 +02:00
application_record.rb
block.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
context.rb Refactor JSON templates to be generated with ActiveModelSerializers instead of Rabl (#4090) 2017-07-07 04:02:06 +02:00
conversation.rb
conversation_mute.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
custom_emoji.rb Encode custom emojis as resolveable objects in ActivityPub (#5243) 2017-10-07 17:43:42 +02:00
custom_emoji_filter.rb Improve admin UI for custom emojis, add copy/disable/enable (#5231) 2017-10-05 23:42:05 +02:00
domain_block.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
email_domain_block.rb Implement EmailBlackList (#5109) 2017-10-04 15:16:10 +02:00
export.rb
favourite.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
feed.rb Non-Serial ("Snowflake") IDs (#4801) 2017-10-04 09:56:37 +02:00
follow.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
follow_request.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
import.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
instance.rb
instance_filter.rb Add instance search feature (#4925) 2017-09-13 12:30:07 +02:00
keyword_mute.rb Use more idiomatic string concatentation. #164. 2017-10-21 14:54:36 -05:00
media_attachment.rb Merge upstream 2.0ish #165 2017-10-11 10:43:10 -07:00
mention.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
mute.rb Merge upstream 2.0ish #165 2017-10-11 10:43:10 -07:00
notification.rb Fix UserTrackingConcern firing on every request, optimize some queries (#5368) 2017-10-13 16:44:29 +02:00
preview_card.rb Increase max height of preview card image (#5092) 2017-09-25 17:10:49 +02:00
remote_follow.rb rescue HTTP::ConnectionError in RemoteFollowController#create (#4726) 2017-08-28 19:12:09 +02:00
remote_profile.rb Introduce OStatus::TagManager (#5008) 2017-09-19 18:08:08 +02:00
report.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
report_filter.rb
search.rb Refactor JSON templates to be generated with ActiveModelSerializers instead of Rabl (#4090) 2017-07-07 04:02:06 +02:00
session_activation.rb Refactor Web::PushSubscription, remove welcome message (#4524) 2017-09-01 13:35:23 +02:00
setting.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
site_upload.rb Uploads for admin site settings (#4913) 2017-09-14 00:04:30 +02:00
status.rb Merge remote-tracking branch 'origin/master' into gs-master 2017-10-16 01:29:02 -05:00
status_pin.rb Allow multiple pinned statuses to be shown and make them be ordered b… (#4690) 2017-08-25 18:50:52 +02:00
stream_entry.rb Merge upstream 2.0ish #165 2017-10-11 10:43:10 -07:00
subscription.rb Make IdsToBigints (mostly!) non-blocking (#5088) 2017-10-02 21:28:59 +02:00
tag.rb add validation to tag name (#4194) 2017-07-14 11:02:49 +02:00
user.rb Add option to reduce motion (#5393) 2017-10-16 09:36:15 +02:00
web.rb