Ruby中集合VS数组的性能

Aje*_*i32 2 ruby

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

Mar*_*une 5

真正的答案是:编写最易读和可维护的代码,并在您显示它是一个瓶颈后才对其进行优化.如果您能找到线性时间内的算法,无需对其进行优化.在这里很容易找到......

不太确定你建议使用哪种方法,但使用我的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
Run Code Online (Sandbox Code Playgroud)

显然,像第三种方法一样构建中间数组是没有意义的.否则,因为你将进入,它不会产生很大的不同O(n); 这是主要的事情.

顺便说一句,这两个sets,uniqArray#|使用eql?hash你的对象,而不是<=>.这些需要以理智的方式定义,因为默认情况下,对象永远不会,eql?除非它们具有相同的object_id(请参阅此问题)