Profiling
When RuboCop feels slow, profiling helps you find the bottleneck — whether it’s a particular cop, a large file, or excessive memory allocation.
| Profiling requires MRI (CRuby). It is not available on JRuby or Windows. |
CPU profiling with --profile
The --profile flag uses the stackprof gem
to record wall-time samples while RuboCop runs. Add it to your Gemfile first:
gem 'stackprof', require: false
Then run:
$ rubocop --profile
# ...
Profile report generated at tmp/rubocop-stackprof.dump
The dump file is written to tmp/rubocop-stackprof.dump in your project root.
You can inspect it with the stackprof CLI:
# Top methods by wall time
$ stackprof tmp/rubocop-stackprof.dump --limit 20
# Call tree for a specific method
$ stackprof tmp/rubocop-stackprof.dump --method 'RuboCop::Cop::Style::MethodCallWithArgsParentheses#on_send'
# Flamegraph (open in a browser)
$ stackprof --flamegraph tmp/rubocop-stackprof.dump > tmp/flamegraph.json
$ stackprof --flamegraph-viewer tmp/flamegraph.json
To profile a single cop, combine --profile with --only:
rubocop --profile --only Style/StringLiterals.
|
Memory profiling with --memory
The --memory flag (used together with --profile) additionally tracks memory
allocations using the
memory_profiler gem. Add both
gems to your Gemfile:
gem 'stackprof', require: false
gem 'memory_profiler', require: false
Then run:
$ rubocop --profile --memory
# ...
Profile report generated at tmp/rubocop-stackprof.dump
Building memory report...
Memory report generated at tmp/rubocop-memory_profiler.txt
The memory report is a human-readable text file showing allocations grouped by gem, file, location, and class.
| Memory profiling is expensive. On a large codebase it can take a very long time and consume significant memory. Limit the scope to a subset of files or cops: |
$ rubocop --profile --memory app/models/
$ rubocop --profile --memory --only Layout/LineLength lib/
Tips
-
Caching is disabled automatically when profiling, so results reflect actual cop execution rather than cache hits.
-
Narrow the scope — profiling the entire codebase produces noisy results. Focus on a single directory or cop to get actionable data.
-
Compare before and after — if you’re optimizing a cop, profile it in isolation (
--only) before and after your change to measure the improvement.
Reporting performance problems
If you discover a performance bottleneck in RuboCop, please open an issue or pull request with the profiling data. See Contributing for details.