help me my masotodon ate a calckey and now it has reactions qts and stuff
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)
|
||
|---|---|---|
| app | ||
| bin | ||
| config | ||
| db | ||
| docs | ||
| lib | ||
| log | ||
| nanobox | ||
| public | ||
| spec | ||
| streaming | ||
| vendor/assets | ||
| .babelrc | ||
| .buildpacks | ||
| .codeclimate.yml | ||
| .dockerignore | ||
| .editorconfig | ||
| .env.nanobox | ||
| .env.production.sample | ||
| .env.test | ||
| .env.vagrant | ||
| .eslintignore | ||
| .eslintrc.yml | ||
| .foreman | ||
| .gitattributes | ||
| .gitignore | ||
| .haml-lint.yml | ||
| .nanoignore | ||
| .nvmrc | ||
| .postcssrc.yml | ||
| .profile | ||
| .rspec | ||
| .rubocop.yml | ||
| .ruby-version | ||
| .scss-lint.yml | ||
| .slugignore | ||
| .travis.yml | ||
| .yarnclean | ||
| app.json | ||
| Aptfile | ||
| boxfile.yml | ||
| Capfile | ||
| CODEOWNERS | ||
| config.ru | ||
| CONTRIBUTING.md | ||
| docker-compose.yml | ||
| docker_entrypoint.sh | ||
| Dockerfile | ||
| Gemfile | ||
| Gemfile.lock | ||
| ISSUE_TEMPLATE.md | ||
| jest.config.js | ||
| LICENSE | ||
| package.json | ||
| Procfile | ||
| Procfile.dev | ||
| Rakefile | ||
| README.md | ||
| scalingo.json | ||
| Vagrantfile | ||
| yarn.lock | ||
Mastodon Glitch Edition
Now with automated deploys!
So here's the deal: we all work on this code, and then it runs on dev.glitch.social and anyone who uses that does so absolutely at their own risk. can you dig it?
- You can view documentation for this project at glitch-soc.github.io/docs/.
- And contributing guidelines are available here and here.