gpt4 book ai didi

scala - 为什么 headOption 更快

转载 作者:行者123 更新时间:2023-12-03 15:59:21 25 4
gpt4 key购买 nike

我对一些代码进行了更改,速度提高了 4.5 倍。我想知道为什么。它曾经基本上是:

def doThing(queue: Queue[(String, String)]): Queue[(String, String)] = queue match {
case Queue((thing, stuff), _*) => doThing(queue.tail)
case _ => queue
}

我把它改成这个以获得巨大的速度提升:
def doThing(queue: Queue[(String, String)]): Queue[(String, String)] = queue.headOption match {
case Some((thing, stuff)) => doThing(queue.tail)
case _ => queue
}

什么 _*与 headOption 相比,为什么它如此昂贵?

最佳答案

-Xprint:all 运行 scalac 后我的猜测是在 queue match { case Queue((thing, stuff), _*) => doThing(queue.tail) } 中 patmat 的末尾例如,我看到以下方法被调用(为简洁起见进行了编辑):

val o9 = scala.collection.immutable.Queue.unapplySeq[(String, String)](x1);
if (o9.isEmpty.unary_!)
if (o9.get.!=(null).&&(o9.get.lengthCompare(1).>=(0)))
{
val p2: (String, String) = o9.get.apply(0);
val p3: Seq[(String, String)] = o9.get.drop(1);

所以 lengthCompare 以可能优化的方式比较集合的长度。对于 Queue ,它创建一个迭代器并迭代一次。所以这应该有点快。另一方面 drop(1) 还构造了一个迭代器,跳过一个元素并将其余元素添加到结果队列中,因此这将与集合的大小成线性关系。
headOption示例更直接,它检查列表是否为空(两次比较),如果不是则返回 Some(head) ,然后只有它的 _1_2分配给 thingstuff .所以没有创建迭代器,并且集合的长度没有线性。

关于scala - 为什么 headOption 更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17961149/

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