Ruby on Rails: какова производительность .constantize? - PullRequest
1 голос
/ 11 августа 2010

Допустим, у меня есть

 Model.find(something)

и

variable.constantize.find(something)

Каковы различия в производительности?

Я имею в виду, что отсутствие лишнего шага, очевидно, будет быстрее, но есть ли разница под капотом?

Перефразирование 12+ методов с разных контроллеров в один метод с постоянством - это УДИВИТЕЛЬНО! но сильно ли это влияет на производительность моего приложения?

Ответы [ 2 ]

6 голосов
/ 18 октября 2016

Я знаю, что это довольно старый, но у меня был тот же вопрос и я написал небольшой тест, чтобы ответить на него: (gist: https://gist.github.com/Haniyya/0d52fb8ae4c3cb3d46a07fc4180c3303)

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
0 голосов
/ 11 августа 2010

Единственный способ узнать наверняка - это профилировать свое приложение как с использованием, так и без использования constantize и сравнить результаты.Без описания производительности любой ответ, который кто-либо даст вам здесь, будет предположением и догадкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...