声明具有初始大小和默认值的数组的运行时间是什么?
答案 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"]
至于直观的解释:
它基本上分配一个连续的内存块(*),并在每个单独的内存块中写入对象的表示(指针)(一个块是一个数组元素)。对每个块的迭代会导致线性复杂性。
请注意,对于小内存块,可能会进行一些优化以使其保持不变。
(*)对于较大的块,块可能不是连续的,这会导致性能变差。
所有这些都很可能比Ruby的实现本身更依赖于硬件/操作系统。