模式匹配开销?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模式匹配开销?相关的知识,希望对你有一定的参考价值。
我是Scala和Spark的新手,我正在研究算法的实现。我想知道scala模式匹配的使用是否方便以提高代码可读性,或者它是否在执行期间实际引入了显着的开销。我经常需要在地图函数中管理复杂对象/嵌套元组,所以我问你通常的方法是什么。通常在我的比赛中没有真正的比较,它就像是
COLLECTION.map{ case (A, (_,(C,_))) => do something with A and C) }
代替
COLLECTION.map(pair => do something with pair._1 and pair._2._2._1)
非常感谢你。
答案
编译器在第一个代码示例中调用模式匹配的unapply
函数可能比第二个示例更昂贵,后者不需要对值或类型进行内省或运行时测试。但是,第二个示例将失败,除非集合中的所有元素都是预期类型,并且您没有向编译器指出预期的类型。
第一个示例中的模式匹配是否会产生显着的开销取决于它相对于程序其余部分中的计算的调用频率。
另一答案
匹配的开销很小。元组匹配将参数直接提升为元组,元组模式不使用unapply
处理。 f
in
class Foo {
val f: ((Double, Int)) => Double = { case (d, i) => d + i }
}
编译(没有优化标志)in
0: aload_0
1: astore_3
2: aload_3
3: ifnull 21
6: aload_3
7: invokevirtual #35 // Method scala/Tuple2._2$mcD$sp:()D
10: dstore 4
12: dload 4
14: iconst_1
15: i2d
16: dadd
17: dstore_1
18: goto 33
21: goto 24
24: new #37 // class scala/MatchError
27: dup
28: aload_3
29: invokespecial #41 // Method scala/MatchError."<init>":(Ljava/lang/Object;)V
32: athrow
33: dload_1
34: dreturn
有一个(无结果)测试匹配错误。
一般来说,你认为可以接受多少开销是无法回答的。
以上是关于模式匹配开销?的主要内容,如果未能解决你的问题,请参考以下文章