gpt4 book ai didi

scala - 在 Scala 中使用类型类模式对性能有什么影响

转载 作者:行者123 更新时间:2023-12-03 15:29:33 32 4
gpt4 key购买 nike

我目前正在广泛使用类型类模式作为代码中与性能相关的部分。我至少找出了两个潜在的低效率来源。

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

  • 当然,在应用类型类模式时,可能还有其他的低效率来源。请告诉我他们的情况。

    最佳答案

    如果您真的很关心编写超高性能代码(并且您可能认为自己这样做了,但在这方面大错特错),那么由于以下原因,类型类会引起一些痛苦:

  • 许多额外的虚方法调用
  • 可能的原语装箱(例如,如果将 scalaz 的类型类用于幺半群等)
  • 通过 def 创建对象这是必要的,因为函数不能参数化
  • 创建对象以访问“拉皮条”方法

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

    }

    你可以看到这里正在进行大量的对象创建

    关于scala - 在 Scala 中使用类型类模式对性能有什么影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9327465/

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