gpt4 book ai didi

scala - Scala 的编译器在重用已知函数结果方面的效率如何?

转载 作者:行者123 更新时间:2023-12-04 09:43:12 25 4
gpt4 key购买 nike

我正在研究基于 Scala 的分析系统 (http://www.hiringthing.com),我发现我经常问自己以下问题。给定一个没有副作用的“纯”函数,如果我用相同的输入两次命中该函数,我是否可以期望编译器重用第一次运行生成的值,或者它会再次遍历所有代码。换句话说,下面的第一个例子是否比第二个更有效?

def add(x: Int, y: Int) = x + y * 10000000000

val a = add(1,2)
do_something(a)
do_another_thing(a)

对比
def add(x: Int, y: Int) = x + y * 10000000000

do_something( add(1,2) )
do_another_thing( add(1,2) )

如果编译器确实可以优化第二种情况,那么函数的复杂度是否有限制?

我想要做的是避免为了编程方便而多次运行某些数学繁重的函数......

谢谢

最佳答案

据我所知,Scala 编译器根本没有优化它。 JVM 可能会,如果它可以确定结果不会改变,但通常它没有很好的方法知道。

所以,一般来说,如果它是一个微不足道的计算,它没有什么区别,因为它很微不足道,而且因为 JVM 可以确定它只需要执行一次。如果它很复杂,而且速度很重要,你应该使用 val a =除非您有基准测试向您证明 JVM 在这种情况下足够智能。

请注意,有时放置 val 会感到尴尬。有两种方法可以解决这个问题。首先,请注意几乎任何东西都可以用大括号中的等效语句替换,因此异常可能比您想象的要少。此外,此方法在某些情况下可能很有用:

def reuse[A,B](a: A)(f: A => B) = f(a)
reuse(add(1,2))( a => { do_something(a); do_another_thing(a)})

关于scala - Scala 的编译器在重用已知函数结果方面的效率如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3835097/

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