3

在 Ruby 中,我正在构建一个方法,该方法构造并返回一个(可能很大)数组,该数组不应包含重复元素。通过使用集合然后将其转换为数组,我会获得更好的性能吗?.uniq或者在我返回之前调用我正在使用的数组会更好吗?或者如何使用&将项目附加到数组而不是+=?如果我确实使用了一个集合,那么<=>在我放入集合中的对象上没有一个方法会对性能产生影响吗?(如果你不确定,你知道测试这个的方法吗?)

4

2 回答 2

6

真正的答案是:编写最具可读性和可维护性的代码,并且只有在证明它是瓶颈之后才对其进行优化。如果你能找到一个线性时间的算法,你就不必优化它。在这里很容易找到...

不太确定您建议使用哪种方法,但使用我的fruitygem:

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 setsuniq而不是. 这些需要以理智的方式定义,因为默认情况下对象永远不会,除非它们具有相同的(请参阅此问题Array#|eql?hash<=>eql?object_id

于 2012-08-16T17:15:59.387 回答
3

您是否尝试过使用Benchmark库?测试通常很容易构建,并且可以正确反映它在您的特定 Ruby 版本中的工作方式。

于 2012-08-16T16:46:22.280 回答