如何找到Ruby方法的复杂性?
例如length?如果我查看源代码,我会看到:
static VALUE
rb_ary_length(VALUE ary)
{
long len = RARRAY_LEN(ary);
return LONG2NUM(len);
}
但我不知道怎么读它才能找到Big O符号。
答案 0 :(得分:5)
没有维护Ruby方法的理论复杂性列表。您感兴趣的是minitest/benchmark
,其使用方式如下:
require 'minitest/autorun'
require 'minitest/benchmark'
class TestFoobar < Minitest::Benchmark
def setup
@foo_arrays = ( 1 .. 10_000 ).map { |n| [ 42 ] * n }
# Because default benchmarking range is [1, 10, 100, 1_000, 10_000]
end
def bench_foo_size
assert_performance_constant 0.99 do |n| @foo_arrays[ n ].size end
end
end
如果运行上述测试,您实际上可以看到Array#size
方法的性能不变。如果您将#bench_foo_size
更改为:
def bench_foo_size
assert_performance_linear 0.99 do |n| @foo_arrays[ n ].size end
end
测试实际上会失败,因为Array#size
不是线性的,而是次线性的。 minitest/benchmark
非常灵活,您可以将其应用于您自己的代码以及内置资源。
答案 1 :(得分:2)
您无法从中获取相关信息。您必须查看RARRAY_LEN
和LONG2NUM
的来源。
估算方法复杂性的一种简单方法是使用您感兴趣的维度不同的参数运行基准,并在图表上绘制。
答案 2 :(得分:1)
O(1)
方法只有length
。数组的长度存储在变量中,无需进一步计算即可返回。
如何找出答案?通过阅读源代码并分析实现和算法。