SORU
11 EYLÜL 2009, Cuma


Ruby: Proc#arama vs verim

thrice yöntemi Ruby aşağıdaki iki uygulamaları arasında davranış farkları nelerdir?

module WithYield
  def self.thrice
    3.times { yield }      # yield to the implicit block argument
  end
end

module WithProcCall
  def self.thrice(&block)  # & converts implicit block to an explicit, named Proc
    3.times { block.call } # invoke Proc#call
  end
end

WithYield::thrice { puts "Hello world" }
WithProcCall::thrice { puts "Hello world" }

"Davranış farklılıkları" hata işleme, performans, araç, destek, vb. ile

CEVAP
11 EYLÜL 2009, Cuma


İlki aslında diğer sözdizimsel şeker olduğunu düşünüyorum. Diğer bir deyişle davranışsal fark yok.

İkinci şekilde de olsa "değişken." blok kurtarmak için ne sağlar Sonra blok zaman geri başka bir zamanda çağrılabilir.

< / ^ hr .

Tamam. Bu sefer gittim ve hızlı bir karşılaştırma yaptı

require 'benchmark'

class A
  def test
    10.times do
      yield
    end
  end
end

class B
  def test(&block)
    10.times do
      block.call
    end
  end
end

Benchmark.bm do |b|
  b.report do
    a = A.new
    10000.times do
      a.test{ 1   1 }
    end
  end

  b.report do
    a = B.new
    10000.times do
      a.test{ 1   1 }
    end
  end

  b.report do
    a = A.new
    100000.times do
      a.test{ 1   1 }
    end
  end

  b.report do
    a = B.new
    100000.times do
      a.test{ 1   1 }
    end
  end

end

Sonuçlar ilginç:

      user     system      total        real
  0.090000   0.040000   0.130000 (  0.141529)
  0.180000   0.060000   0.240000 (  0.234289)
  0.950000   0.370000   1.320000 (  1.359902)
  1.810000   0.570000   2.380000 (  2.430991)

Bu kullanarak gösterirblok.Araneredeyse 2x kullanarak daha yavaştırverim.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • TouchePro

    TouchePro

    27 EYLÜL 2007
  • Unbox Therapy

    Unbox Therap

    21 Aralık 2010
  • Visual Life

    Visual Life

    3 Temmuz 2006