gpt4 book ai didi

Ruby 数学函数内存

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:20 25 4
gpt4 key购买 nike

我写了一些看起来像这样的代码:

def get(x, y)
@cachedResults.set(x,y, Math.hypot(x, y)) if @cachedResults.get(x,y).nil?
@cachedResults.get(x,y)
end

@cachedResults 包含我编写的 2D Array 类(在几分钟内),此函数的目的是确保我永远不必为任何给定的 (x,y) 调用 Math.hypot 两次。 [这可以使用对称性和其他东西进一步优化,但无论如何]

所以我调用了这个函数,让它运行了160000次;它运行了 15 秒多一点。然后,为了查看它比非 Memoized 版本快多少,我将代码更改为:

def get(x, y)
Math.hypot(x, y)
end

而且,令我惊讶的是,再次运行仅用了 15 秒多一点。完全相同的时间。所以我的问题是,ruby 中的数学函数是自然内存的吗?如果是这样,ruby Memoized 的程度如何?

(如果不是,那你为什么认为我一直得到这个结果?)

最佳答案

为您做任何事情 160000 次大约需要 15 秒吗?在您的系统上对其进行基准测试,仅返回 x; hypot 操作(在 C 中实现)很可能比解释器开销可以忽略不计。

对于带有 khell 的 memoized get 方法的 ruby​​ 1.8.7,在 get 方法中调用函数,并在 get 方法中返回 x,迭代 100000 次:

peregrino:$ time ruby src/memoized_hypot.rb real    0m1.714suser    0m1.436ssys 0m0.080speregrino:$ time ruby src/plain_hypot.rb real    0m0.495suser    0m0.364ssys 0m0.060speregrino:$ time ruby src/empty_hypo.rb real    0m0.369suser    0m0.220ssys 0m0.068s

kheill's memoization creates a string on every call, which is much more costly than calling the C library's hypot function on every call.

The difference between the calling hypot and just returning x indicates that hypot is only contributing 25% of the runtime. It's not the code you should be optimising - instead try inlining the call to the library if you can rather than wrapping it in another method.

peregrino:$ time ruby src/inline_hypot.rb real    0m0.365suser    0m0.236ssys 0m0.044s

which is

100000.times{ |i| Math.hypot(i,6) }   

而不是

100000.times{ |i| foo.get(i,6) }   

其中 foo 是一个包含方法的对象。


这些时间是在上网本 (Asus eeepc 900) 上测得的,它的速度不是非常快,所以它们比您的时间快得多有点奇怪。因此,其他因素可能会主导您的结果。

关于Ruby 数学函数内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1529561/

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