Ruby on Rails:.constantize的性能是什么?

时间:2010-08-11 14:53:51

标签: ruby-on-rails

假设我有

 Model.find(something)

variable.constantize.find(something)

性能差异是什么?

我的意思是,没有额外的步骤显然会更快,但在引擎盖下,是否有那么大的差异?

将来自不同控制器的12种方法重构为具有constantize的一种方法令人惊叹!但它是否严重影响了我的应用程序的性能?

2 个答案:

答案 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来分析您的应用程序并比较结果。如果没有对性能进行分析,任何人在这里给你的回答都是猜测和猜测。