在 Ruby 中,我正在构建一个方法,该方法构造并返回一个(可能很大)数组,该数组不应包含重复元素。通过使用集合然后将其转换为数组,我会获得更好的性能吗?.uniq
或者在我返回之前调用我正在使用的数组会更好吗?或者如何使用&
将项目附加到数组而不是+=
?如果我确实使用了一个集合,那么<=>
在我放入集合中的对象上没有一个方法会对性能产生影响吗?(如果你不确定,你知道测试这个的方法吗?)
问问题
3583 次
2 回答
6
真正的答案是:编写最具可读性和可维护性的代码,并且只有在证明它是瓶颈之后才对其进行优化。如果你能找到一个线性时间的算法,你就不必优化它。在这里很容易找到...
不太确定您建议使用哪种方法,但使用我的fruity
gem:
require 'fruity'
require 'set'
enum = 1000.times
compare do
uniq { enum.each_with_object([]){|x, array| array << x}.uniq }
set { enum.each_with_object(Set[]){|x, set| set << x}.to_a }
join { enum.inject([]){|array, x| array | [x]} }
end
# set is faster than uniq by 10.0% ± 1.0%
# uniq is faster than join by 394x ± 10.0
显然,像第三种方法那样构建中间数组是没有意义的。否则,这不会有太大的不同,因为你会在O(n)
;这是主要的事情。
顺便说一句,在您的对象上都使用and sets
,uniq
而不是. 这些需要以理智的方式定义,因为默认情况下对象永远不会,除非它们具有相同的(请参阅此问题)Array#|
eql?
hash
<=>
eql?
object_id
于 2012-08-16T17:15:59.387 回答
3
您是否尝试过使用Benchmark库?测试通常很容易构建,并且可以正确反映它在您的特定 Ruby 版本中的工作方式。
于 2012-08-16T16:46:22.280 回答