我在数组objects
中有一些对象。给定一个属性 - 值对,我需要一个函数来返回匹配它的第一个对象。例如,给定objects.byName "John"
,它应该返回带有name: "John"
的第一个对象。
目前我正在这样做:
def self.byName name
ID_obj_by_name = {}
@@objects.each_with_index do |o, index|
ID_obj_by_name[o.name] = index
end
@@objects[ID_obj_by_name[name]]
end
但它似乎很慢,并且使用了大量内存。我怎样才能改善这个?
答案 0 :(得分:1)
如果您需要表现,您应该考虑这种方法:
require 'benchmark'
class Foo
def initialize(name)
@name = name
end
def name
@name
end
end
# Using array ######################################################################
test = []
500000.times do |i|
test << Foo.new("ABC" + i.to_s + "#!@#@!DS")
end
puts "using array"
time = Benchmark.measure {
result = test.find { |o| o.name == "ABC250000#!@#@!DS" }
}
puts time
####################################################################################
# Using a hash #####################################################################
test = {}
i_am_your_object = Object.new
500000.times do |i|
test["ABC" + i.to_s + "#!@#@!DS"] = i_am_your_object
end
puts "using hash"
time = Benchmark.measure {
result = test["ABC250000#!@#@!DS"]
}
puts time
####################################################################################
结果:
using array
0.060000 0.000000 0.060000 ( 0.060884)
using hash
0.000000 0.000000 0.000000 ( 0.000005)
答案 1 :(得分:0)
尝试类似
的内容def self.by_name name
@@objects.find { |o| o.name == name }
end