如何找到 Ruby 方法的复杂度?
例如length http://www.ruby-doc.org/core-2.1.2/Array.html?如果我查看源代码,我会看到以下内容:
static VALUE
rb_ary_length(VALUE ary)
{
long len = RARRAY_LEN(ary);
return LONG2NUM(len);
}
但我不知道如何阅读它才能找到大 O 符号。
没有维护 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
to:
def bench_foo_size
assert_performance_linear 0.99 do |n| @foo_arrays[ n ].size end
end
测试实际上会失败,因为Array#size
不是线性的,而是次线性的。minitest/benchmark
非常灵活,您可以将其应用到您自己的代码以及内置资产中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)