gpt4 book ai didi

使用 float 时,Scala foldLeft 性能比 for 循环差 4 倍

转载 作者:行者123 更新时间:2023-12-04 15:54:19 24 4
gpt4 key购买 nike

谁能对这个主题有更广泛的了解,解释一下,为什么

var acc = 0.0
for (i <- 0 until 100)
acc += 4.0 * (1 - (i % 2) * 2) / (2 * i + 1)

快4倍以上
(0 until 100).foldLeft(0.0)({
(d, i) => d + 4.0 * (1 - (i % 2) * 2) / (2 * i + 1)
})

我更喜欢函数式版本,只是不太了解性能方面的影响。有什么方法可以对此进行优化,或者可以使用 foldLeft 替代方案?

最佳答案

首先,这是一个太小的例子,无法获得准确的基准。你真的不能从这些数字中看出任何东西。您还必须控制诸如 JVM 预热之类的事情,这将完全丢弃您获得的任何数字。

也就是说,您可以查看源代码以确切了解这些东西是如何实现的。特别地,RangefoldLeft定义在TraversableOnce上,可以查看here :

def foldLeft[B](z: B)(op: (B, A) => B): B = {
var result = z
this foreach (x => result = op(result, x))
result
}

如您所见,foldLeft 只是委托(delegate)给 foreach,这正是 for(...) 语法解析的结果.

换句话说,他们实际上在做同样的事情。

一般规则是,除非您进行大量计算,否则您可能不会在类似的任何事情上看到真正的性能差异。如果这确实是一个问题,最快的方法是使用 while 循环。

关于使用 float 时,Scala foldLeft 性能比 for 循环差 4 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24293545/

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