SORU
3 Temmuz 2013, ÇARŞAMBA


Ruby dinamik arama yöntemi

Üç yolu vardır bildiğim kadarıyla dinamik olarak Ruby yöntemi:

Yöntem 1:

s = SomeObject.new
method = s.method(:dynamic_method)
method.call

Yöntem 2:

s = SomeObject.new
s.send(:dynamic_method)

Yöntem 3:

s = SomeObject.new
eval "s.dynamic_method"

Onları kıyaslama Yöntem 1 yavaştır bugüne kadar en hızlı Yöntem 2 olduğunu tespit ettim ve Yöntem 3 farkla yavaş.

Ayrıca .call .send eval yok iken özel yöntemler arayarak, izin bulduk.

Benim sorum ise şu: herhangi bir nedenle hiç .send eval var mı acaba? Neden her zaman en hızlı yöntemi kullanmak istemez misiniz? Diğer farklar dinamik yöntem çağırma bu yöntemler nedir?

CEVAP
3 Temmuz 2013, ÇARŞAMBA


herhangi bir nedenle hiç send var mı acaba?

call nesne, 26* *gelmez bir yönteme ihtiyacı var:

class Foo
  def method_missing(name)
    "#{name} called"
  end
end

Foo.new.send(:bar)         #=> "bar called"
Foo.new.method(:bar).call  #=> undefined method `bar' for class `Foo' (NameError)

herhangi bir nedenle hiç eval var mı acaba?

eval keyfi ifadeler, sadece bir yöntemi çağırmak için değil değerlendirir.


İlişkin kriterler send * call*21 daha hızlı gibi görünüyor:

require 'benchmark'

class Foo
  def bar; end
end

Benchmark.bm(4) do |b|
  b.report("send") { 1_000_000.times { Foo.new.send(:bar) } }
  b.report("call") { 1_000_000.times { Foo.new.method(:bar).call } }
end

Sonuç:

           user     system      total        real
send   0.210000   0.000000   0.210000 (  0.215181)
call   0.740000   0.000000   0.740000 (  0.739262)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • KittiesMama

    KittiesMama

    10 AĞUSTOS 2008
  • kremosakhaz

    kremosakhaz

    25 AĞUSTOS 2006
  • RiverCityGraphix

    RiverCityGra

    6 Ocak 2012