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 string -
application_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 name -
application_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)