在Scala中使用类型类模式的性能影响是什么?
我正在广泛使用类型类模式来代替我的代码的性能相关部分.我提出了至少两个潜在的低效率来源.
>隐式参数通过消息调用传递.我不知道这是否真的发生.也许scalac可以简单地插入使用它们的隐式参数,并从方法签名中删除它们.在手动插入隐式参数的情况下,这可能是不可能的,因为它们可能仅在运行时解析.对传递隐含参数有什么优化? 当然,当应用类型类模式时,可能还会有其他低效率的来源.请告诉我他们. 解决方法
如果您真正关心编写超高性能代码(您可能会认为您这样做,但对此非常错误),那么类型将会导致一些痛苦,原因如下:
>许多额外的虚拟方法调用 在运行时,JVM可以优化某些错误的创建(例如,仅仅创建MA来调用*),但是scalac并没有太多的帮助.您可以通过编译使用类型类和使用-Xprint:icode作为参数的一些代码来看到这一点. 以下是一个例子: import scalaz._; import Scalaz._ object TC { def main(args: Array[String]) { println((args(0).parseInt.liftFailNel |@| args(1).parseInt.liftFailNel)(_ |+| _)) } } 这里是icode: final object TC extends java.lang.Object with ScalaObject { def main(args: Array[java.lang.String]): Unit = scala.this.Predef.println(scalaz.this.Scalaz.ValidationMA(scalaz.this.Scalaz.StringTo(args.apply(0)).parseInt().liftFailNel()).|@|(scalaz.this.Scalaz.StringTo(args.apply(1)).parseInt().liftFailNel()).apply({ (new anonymous class TC$$anonfun$main$1(): Function2) },scalaz.this.Functor.ValidationFunctor(),scalaz.this.Apply.ValidationApply(scalaz.this.Semigroup.NonEmptyListSemigroup()))); def this(): object TC = { TC.super.this(); () } }; @SerialVersionUID(0) final <synthetic> class TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$2 extends scala.runtime.AbstractFunction0 with Serializable { final def apply(): Int = TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$2.this.v1$1; final <bridge> def apply(): java.lang.Object = scala.Int.box(TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$2.this.apply()); <synthetic> <paramaccessor> private[this] val v1$1: Int = _; def this($outer: anonymous class TC$$anonfun$main$1,v1$1: Int): anonymous class TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$2 = { TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$2.this.v1$1 = v1$1; TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$2.super.this(); () } }; @SerialVersionUID(0) final <synthetic> class TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$1 extends scala.runtime.AbstractFunction0$mcI$sp with Serializable { final def apply(): Int = TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$1.this.apply$mcI$sp(); <specialized> def apply$mcI$sp(): Int = TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$1.this.v2$1; final <bridge> def apply(): java.lang.Object = scala.Int.box(TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$1.this.apply()); <synthetic> <paramaccessor> private[this] val v2$1: Int = _; def this($outer: anonymous class TC$$anonfun$main$1,v2$1: Int): anonymous class TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$1 = { TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$1.this.v2$1 = v2$1; TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$1.super.this(); () } }; @SerialVersionUID(0) final <synthetic> class TC$$anonfun$main$1 extends scala.runtime.AbstractFunction2$mcIII$sp with Serializable { final def apply(x$1: Int,x$2: Int): Int = TC$$anonfun$main$1.this.apply$mcIII$sp(x$1,x$2); <specialized> def apply$mcIII$sp(v1$1: Int,v2$1: Int): Int = scala.Int.unbox(scalaz.this.Scalaz.mkIdentity({ (new anonymous class TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$2(TC$$anonfun$main$1.this,v1$1): Function0) }).|+|({ (new anonymous class TC$$anonfun$main$1$$anonfun$apply$mcIII$sp$1(TC$$anonfun$main$1.this,v2$1): Function0) },scalaz.this.Semigroup.IntSemigroup())); final <bridge> def apply(v1: java.lang.Object,v2: java.lang.Object): java.lang.Object = scala.Int.box(TC$$anonfun$main$1.this.apply(scala.Int.unbox(v1),scala.Int.unbox(v2))); def this(): anonymous class TC$$anonfun$main$1 = { TC$$anonfun$main$1.super.this(); () } } } 您可以看到在这里有大量的对象创建 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |