Getting rid of inefficient constantize
Trying to improve performance of one controller I've found the following:
def application_klass
@application_klass ||= "application/#{params[:type]}".classify.constantize
end
There are Application::Rental and Application::Bridge models in our rails app, so the method above was used in two places:
application_klass.to_s– to get the model name as a stringapplication_klass.model_name.human– to get a class name without module prefix
I've refactored method in the following way:
def application_klass
@application_klass ||= "application/#{params[:type]}".classify
end
And it's occurrences now looks like this:
application_klass– just call this method to get a model nameapplication_klass.demodulize– usingdemodulizeto split a string with::
I've got rid of unnecessary constantize method, which is quite inefficient: just imagine that your application tries to find a constant in your project with the name specified in the string. See the benchmarks below to evaluate performance gains:
counter = 100_000
type = 'Rental'
Benchmark.bm(30) do |x|
x.report('demodulize: ') { counter.times { "application/#{type}".classify.demodulize } }
x.report('constantize.model_name.human: ') { counter.times { "application/#{type}".classify.constantize.model_name.human } }
end
user system total real
demodulize: 3.560000 0.760000 4.320000 ( 4.381891)
constantize.model_name.human: 8.500000 0.070000 8.570000 ( 8.601007)