gpt4 book ai didi

ruby - 为什么 array.min 这么慢?

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:40 25 4
gpt4 key购买 nike

我注意到 array.min 看起来很慢,所以我针对我自己的简单实现做了这个测试:

require 'benchmark'
array = (1..100000).to_a.shuffle

Benchmark.bmbm(5) do |x|
x.report("lib:") { 99.times { min = array.min } }
x.report("own:") { 99.times { min = array[0]; array.each { |n| min = n if n < min } } }
end

结果:

Rehearsal -----------------------------------------
lib: 1.531000 0.000000 1.531000 ( 1.538159)
own: 1.094000 0.016000 1.110000 ( 1.102130)
-------------------------------- total: 2.641000sec

user system total real
lib: 1.500000 0.000000 1.500000 ( 1.515249)
own: 1.125000 0.000000 1.125000 ( 1.145894)

我很震惊。我自己的实现如何通过 each 运行一个 block 来击败内置的?并击败它这么多?

我是不是搞错了?或者这在某种程度上是正常的?我很困惑。


我的 Ruby 版本,在 Windows 8.1 Pro 上运行:

C:\>ruby --version
ruby 2.2.3p173 (2015-08-18 revision 51636) [i386-mingw32]

最佳答案

看看 Enumerable#min 的实现.它最终可能会使用 each 来遍历元素并获取 min 元素,但在此之前它会做一些额外的检查以查看是否需要返回多个元素,或者是否需要比较通过传递的 block 的元素。在你的情况下,元素将通过 min_i 进行比较。函数,我怀疑这就是速度差异的来源 - 该函数将比简单地比较两个数字慢。

没有对数组进行额外的优化,所有的枚举都以相同的方式遍历。

关于ruby - 为什么 array.min 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34695364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com