693c66dfde
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) |
||
---|---|---|
.. | ||
concerns | ||
form | ||
web | ||
account_domain_block.rb | ||
account_filter.rb | ||
account_moderation_note.rb | ||
account.rb | ||
application_record.rb | ||
block.rb | ||
context.rb | ||
conversation_mute.rb | ||
conversation.rb | ||
custom_emoji_filter.rb | ||
custom_emoji.rb | ||
domain_block.rb | ||
email_domain_block.rb | ||
export.rb | ||
favourite.rb | ||
feed.rb | ||
follow_request.rb | ||
follow.rb | ||
import.rb | ||
instance_filter.rb | ||
instance.rb | ||
keyword_mute.rb | ||
media_attachment.rb | ||
mention.rb | ||
mute.rb | ||
notification.rb | ||
preview_card.rb | ||
remote_follow.rb | ||
remote_profile.rb | ||
report_filter.rb | ||
report.rb | ||
search.rb | ||
session_activation.rb | ||
setting.rb | ||
site_upload.rb | ||
status_pin.rb | ||
status.rb | ||
stream_entry.rb | ||
subscription.rb | ||
tag.rb | ||
user.rb | ||
web.rb |