作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对一些代码进行了更改,速度提高了 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
分配给
thing
和
stuff
.所以没有创建迭代器,并且集合的长度没有线性。
关于scala - 为什么 headOption 更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17961149/
我对一些代码进行了更改,速度提高了 4.5 倍。我想知道为什么。它曾经基本上是: def doThing(queue: Queue[(String, String)]): Queue[(String,
我是一名优秀的程序员,十分优秀!