Ruby中Array.new(n,x)的复杂性是什么?

时间:2017-10-18 12:24:57

标签: ruby

声明具有初始大小和默认值的数组的运行时间是什么?

1 个答案:

答案 0 :(得分:1)

关于小数组的常量和之后的线性。

require 'benchmark'

0.upto(9).each do |power|
  elements = 10 ** power
  time = 10.times.map { Benchmark.measure { Array.new(elements, :foo) } }.sum(&:real) / 10
  p [elements, '%f' % time]
end

# [1, "0.000001"]
# [10, "0.000001"]
# [100, "0.000002"]
# [1000, "0.000011"]
# [10000, "0.000038"]
# [100000, "0.000286"]
# [1000000, "0.004231"]
# [10000000, "0.036348"]
# [100000000, "0.404822"]
# [1000000000, "8.454289"]

enter image description here

至于直观的解释:

它基本上分配一个连续的内存块(*),并在每个单独的内存块中写入对象的表示(指针)(一个块是一个数组元素)。对每个块的迭代会导致线性复杂性。

请注意,对于小内存块,可能会进行一些优化以使其保持不变。

(*)对于较大的块,块可能不是连续的,这会导致性能变差。

所有这些都很可能比Ruby的实现本身更依赖于硬件/操作系统。