LINUX.ORG.RU

Пара ньюансов при обработке пакетных даных в руби.

 , ознакомления тред


3

2

Кому-то эти нюансы, вероятно известны, а кому-то будут интересны. Коротко: помните о существовании Set, each_value, find. - производительность от этого может вырасти в разы. Так же, удобная штука - использование скобок в параметрах блоков.

require 'set'
a = []
s = Set.new
h = {}

n = 10000

Benchmark.bm(3) do |b|
  puts 'add'
  b.report("array:"){ 200.times{|i| a << i } }
  b.report("set  :"){ 200.times{|i| s << i } }
  b.report("hash :"){ 200.times{|i| h[:"#{i}"] = i } }
  puts 'include?'
  b.report("array:"){ 200.times{|i| a.include? i } }
  b.report("set  :"){ 200.times{|i| s.include? i } }
  puts 'inject'
  b.report("array:"){ n.times{|i| a.inject(0){|s, v| s + v } } }
  b.report("set  :"){ n.times{|i| s.inject(0){|s, v| s + v } } }
  b.report("hash :"){ n.times{|i| h.inject(0){|s, ( k, v )| s + v } } }
  b.report("hash :"){ n.times{|i| h.each_value.inject(0){|s, v| s + v } } }
  b.report("hash :"){ n.times{|i| h.inject(0){|s, v| s + v.last } } }
  puts 'find'
  b.report("array:"){ n.times{|i| a.find{|el| el == 150 } } }
  b.report("set  :"){ n.times{|i| s.find{|el| el == 150 } } }
  b.report("hash :"){ n.times{|i| h[:"150"] } }
  puts 'each'
  b.report("array:"){ n.times{|i| a.each &:to_s } }
  b.report("set  :"){ n.times{|i| s.each &:to_s } }
  b.report("hash :"){ n.times{|i| h.each_value &:to_s } }
  b.report("hash :"){ n.times{|i| h.each{|k,v| v.to_s } } }
  puts 'map'
  b.report("array:"){ n.times{|i| a.map &:to_s } }
  b.report("set  :"){ n.times{|i| s.map &:to_s } }
  b.report("hash :"){ n.times{|i| h.each_value.map &:to_s } }
  b.report("hash :"){ n.times{|i| h.map{|k,v| v.to_s } } }
end

результат на mri

          user     system      total        real
add
array:  0.000000   0.000000   0.000000 (  0.000043)
set  :  0.000000   0.000000   0.000000 (  0.000103)
hash :  0.000000   0.000000   0.000000 (  0.000344)
include?
array:  0.000000   0.000000   0.000000 (  0.000877)
set  :  0.000000   0.000000   0.000000 (  0.000060)
inject
array:  0.230000   0.000000   0.230000 (  0.226024)
set  :  0.290000   0.010000   0.300000 (  0.298473)
hash :  0.490000   0.000000   0.490000 (  0.487521)
hash :  0.270000   0.000000   0.270000 (  0.287539)
hash :  0.490000   0.000000   0.490000 (  0.497619)
find
array:  0.140000   0.000000   0.140000 (  0.142135)
set  :  0.200000   0.000000   0.200000 (  0.198234)
hash :  0.000000   0.000000   0.000000 (  0.000974)
each
array:  0.380000   0.000000   0.380000 (  0.384158)
set  :  0.460000   0.000000   0.460000 (  0.453658)
hash :  0.450000   0.010000   0.460000 (  0.457729)
hash :  0.670000   0.000000   0.670000 (  0.672617)
map
array:  0.430000   0.000000   0.430000 (  0.430366)
set  :  0.570000   0.000000   0.570000 (  0.572334)
hash :  0.550000   0.000000   0.550000 (  0.558118)
hash :  0.800000   0.010000   0.810000 (  0.796961)

★★★★

Последнее исправление: special-k (всего исправлений: 2)

Всегда использую each_value, но не знал за эту тонкость.
Интересно, спасибо.

Spirit_of_Stallman ★★★
()

Коротко: помните о существовании компилируемых языков с типами. - производительность от этого может вырасти в разы

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.