加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中使用类型类模式的性能影响是什么?

发布时间:2020-12-16 09:14:34 所属栏目:安全 来源:网络整理
导读:我正在广泛使用类型类模式来代替我的代码的性能相关部分.我提出了至少两个潜在的低效率来源. 隐式参数通过消息调用传递.我不知道这是否真的发生.也许scalac可以简单地插入使用它们的隐式参数,并从方法签名中删除它们.在手动插入隐式参数的情况下,这可能是不
我正在广泛使用类型类模式来代替我的代码的性能相关部分.我提出了至少两个潜在的低效率来源.

>隐式参数通过消息调用传递.我不知道这是否真的发生.也许scalac可以简单地插入使用它们的隐式参数,并从方法签名中删除它们.在手动插入隐式参数的情况下,这可能是不可能的,因为它们可能仅在运行时解析.对传递隐含参数有什么优化?
>如果类型类实例由def(与val相反)提供,则必须在“类型分类方法”的每次调用时重新创建该对象. JVM可能会遇到此问题,这可能会优化对象的创建.这个问题也可能被scalac重新使用这些对象.什么优化适用于隐式参数对象的创建?

当然,当应用类型类模式时,可能还会有其他低效率的来源.请告诉我他们.

解决方法

如果您真正关心编写超高性能代码(您可能会认为您这样做,但对此非常错误),那么类型将会导致一些痛苦,原因如下:

>许多额外的虚拟方法调用
>可能拳击原语(例如,如果使用scalaz的类型为monoid等)
>通过def进行对象创建,这是必需的,因为函数不能被参数化
>对象创建访问“pimped”方法

在运行时,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();
    ()
   }
 }

}

您可以看到在这里有大量的对象创建

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读