Commit 18020f00 authored by Stan Hu's avatar Stan Hu

Speed up commit loads by disabling BatchLoader replace_methods

We've seen a significant performance penalty when using
`BatchLoader#__replace_with!`. This defines methods on the batch loader
that proxy to the 'real' object using send. The alternative is
`method_missing`, which is slower.  However, we've noticed that
`method_missing` can be faster if:

1. The objects being loaded have a large interface.
2. We don't call too many methods on the loaded object.

In production, we've seen the rendering times of the merge request
widget increase as a result of loading commit data. BatchLoader attempts
to call replace_methods on the lazy object, but this has a significant
performance penalty. Disabling this mode
(https://github.com/exAspArk/batch-loader/pull/45) appears to cut load
times by about 50% for MergeRequestsController#show.

Relates to https://gitlab.com/gitlab-com/gl-infra/infrastructure/issues/6941
parent 89fa2538
---
title: Speed up commit loads by disabling BatchLoader replace_methods
merge_request: 29633
author:
type: performance
...@@ -44,6 +44,14 @@ describe Commit do ...@@ -44,6 +44,14 @@ describe Commit do
expect(commit.id).to eq(oids[i]) expect(commit.id).to eq(oids[i])
end end
end end
it 'does not attempt to replace methods via BatchLoader' do
subject.each do |commit|
expect(commit).to receive(:method_missing).and_call_original
commit.id
end
end
end end
context 'when not found' do context 'when not found' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment