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)
This commit is contained in:
parent
a4851100fd
commit
693c66dfde
|
@ -23,16 +23,11 @@ class KeywordMute < ApplicationRecord
|
||||||
attr_reader :regex
|
attr_reader :regex
|
||||||
|
|
||||||
def initialize(account)
|
def initialize(account)
|
||||||
re = String.new.tap do |str|
|
re = [].tap do |arr|
|
||||||
scoped = KeywordMute.where(account: account)
|
KeywordMute.where(account: account).select(:keyword, :id).find_each do |m|
|
||||||
keywords = scoped.select(:id, :keyword)
|
arr << Regexp.escape(m.keyword.strip)
|
||||||
count = scoped.count
|
|
||||||
|
|
||||||
keywords.find_each.with_index do |kw, index|
|
|
||||||
str << Regexp.escape(kw.keyword.strip)
|
|
||||||
str << '|' if index < count - 1
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
end.join('|')
|
||||||
|
|
||||||
@regex = /\b(?:#{re})\b/i unless re.empty?
|
@regex = /\b(?:#{re})\b/i unless re.empty?
|
||||||
end
|
end
|
||||||
|
|
Reference in New Issue