12 января 2011 г.

puts("there's more than one way to do it. ")

Небольшой пост на тему необходимости использовать плюшек языка(ов) на примере использования унарного амперсанда в Ruby.
Не будем брызгать слюной, сразу перейдем к примерам:
# a) перебираем элементы массива (1..10)
# b) применение лямбда функции ко всем элементам этого массива при помощи &
# Подопытная лямбда
test_lam=lambda{|inPut|
  puts("#{inPut}: #{inPut**2}");
  inPut**2 # В качестве возвращаемого значения
  }
# синтаксис с &
buf=(1..10).to_a.map &test_lam
# классический эквивалент
buf2=(1..10).to_a.map{|input| test_lam.call(input)}

Результат, предсказуем:
1: 1
2: 4
3: 9
4: 16
5: 25
6: 36
7: 49
8: 64
9: 81
10: 100
# Еще один пример
buf2=[1, 2, 3].map(&:to_s)
p buf2 # => ["1", "2", "3"]
# Эквивалент:
p [1, 2, 3].map { |i| i.to_s }
Что лучше? В сети нашел наводящий на мысли бенчмарк на эту тему
# Небольшой Бенчмарк: (http://blog.hasmanythrough.com/2006/3/7/symbol-to-proc-shorthand,
# http://m.onkey.org/let-s-start-with-wtf )
# traditional calls (with a block as in obj.each {|e| e.method_name }) 
# И Унарный амперсаендd to a Proc (like obj.each(&:method_name)).
require 'benchmark'
require 'rubygems'
require 'active_support'
array = [ 1, 'ab', :dog, 3.8 ]
COUNT = 100_000
Benchmark.bmbm(2) do |test|
  test.report('Using Symbol#to_proc') do
    COUNT.times do
      array.map(&:to_s)
    end
  end
  test.report('Standard call') do
    COUNT.times do
      array.map {|e| e.to_s }
    end
  end
end


Полученный результат
=begin
Rehearsal --------------------------------------------------------
Using Symbol#to_proc   1.125000   0.000000   1.125000 (  1.125000)
Standard call                 0.578000   0.000000   0.578000 (  0.578000)
----------------------------------------------------- total: 1.703000sec


                                          user     system      total        real
Using Symbol#to_proc   1.015000   0.000000   1.015000 (  1.015000)
Standard call                0.563000   0.000000   0.563000 (  0.563000)
=end

Может быть показания спидометра и не являются доказательством правильности курса, но примеры с использованием амперсанда проигрывают по времени исполнения «классическому» стилю.

Комментариев нет:

Отправить комментарий