假设我有
Model.find(something)
和
variable.constantize.find(something)
性能差异是什么?
我的意思是,没有额外的步骤显然会更快,但在引擎盖下,是否有那么大的差异?
将来自不同控制器的12种方法重构为具有constantize的一种方法令人惊叹!但它是否严重影响了我的应用程序的性能?
答案 0 :(得分:6)
我知道这已经很老了,但我只是有同样的问题并写了一些基准来回答它: (要点:https://developers.google.com/cloud-print/docs/appInterfaces)
require 'active_support/inflector'
require 'benchmark'
class James
end
class John
end
class Jimmy
end
NAMES = %w(James Jimmy John).freeze
CLASSES = [James, John, Jimmy].freeze
NAME_HASH = {
:James => James,
:John => John,
:Jimmy => Jimmy
}.freeze
def find_by_case(str)
case str
when 'James' then James
when 'John' then John
when 'Jimmy' then Jimmy
end
end
def find_by_array(str)
CLASSES[NAMES.find_index(str)]
end
def find_by_hash(str)
NAME_HASH[str.to_sym]
end
def find_by_const_get(str)
Kernel.const_get(str)
end
names = %w(James Jimmy John)
iter = 10_000_000
Benchmark.bmbm do |x|
x.report('case: ') { iter.times { find_by_case(names.sample) } }
x.report('hash: ') { iter.times { find_by_hash(names.sample) } }
x.report('array: ') { iter.times { find_by_array(names.sample) } }
x.report('const get: ') { iter.times { find_by_const_get(names.sample) } }
x.report('constantize: ') { iter.times { names.sample.constantize } }
end
=begin
Rehearsal -------------------------------------------------
case: 1.770000 0.000000 1.770000 ( 1.768994)
hash: 2.010000 0.000000 2.010000 ( 2.015642)
array: 1.840000 0.000000 1.840000 ( 1.842172)
const get: 2.830000 0.000000 2.830000 ( 2.832216)
constantize: 9.210000 0.010000 9.220000 ( 9.226218)
--------------------------------------- total: 17.670000sec
user system total real
case: 1.820000 0.000000 1.820000 ( 1.836090)
hash: 2.060000 0.000000 2.060000 ( 2.063271)
array: 1.820000 0.000000 1.820000 ( 1.824192)
const get: 2.810000 0.000000 2.810000 ( 2.802683)
constantize: 9.120000 0.010000 9.130000 ( 9.144598)
=end
答案 1 :(得分:-2)
唯一可以确定的方法是使用和不使用constantize
来分析您的应用程序并比较结果。如果没有对性能进行分析,任何人在这里给你的回答都是猜测和猜测。