【问题标题】:Will method invocation reflection in Scala cause performance degradation?Scala中的方法调用反射会导致性能下降吗?
【发布时间】:2020-03-25 07:04:34
【问题描述】:

我有一个方法打算对数据IO做一些简单的统计,如下图。

def ioStatSink[T <: { def length: Int }](): Sink[T, Future[(Long, Long)]] = Sink.fold((0L, 0L))((acc, bytes) => (acc._1 + 1L, acc._2 + bytes.length))

因为我希望它能够处理具有{ def length: Int } 方法的不同数据类型,所以我将其设为通用。
问题是,这个方法调用使用了反射。
由于这种方法被调用了数百万次,我不希望它有性能问题。
我知道使用反射进行类实例化会降低性能,但是这个方法调用怎么样?

(关于方法的另一个问题是,它无法适应{ def length: Long }方法的类型,有什么建议可以解决这个问题吗?)

【问题讨论】:

  • 是的,它会比正常的方法调用慢。如果不进行分析,这是否会造成巨大的性能损失。但是,如果您想删除反射的使用并更加灵活,我建议您改用Typeclass
  • 我用大约 190MB 的 170 万行文件做了一个简单的测试。将反射调用更改为普通方法调用后,数据处理时间减少了约 22%(从 45s 到 35s)。不确定是否有任何其他因素促成了这一点。我会看看Typeclass。谢谢! @LuisMiguelMejíaSuárez

标签: scala generics reflection structural-typing


【解决方案1】:

既然您说您对 typeclass 替代方案感兴趣。
这是一个简单的演示。

import scala.language.higherKinds

trait Sizeable[T] {
  def size(t: T): Long
}

object Sizeable {
  private final val _IterableOnceSizable: Sizeable[IterableOnce[_]] =
    new Sizeable[IterableOnce[_]] {
      override final def size(iter: IterableOnce[_]): Long = {
        val knownSize = iter.knownSize
        if (knownSize == -1) iter.iterator.size.toLong
        else knownSize.toLong
      }
    }

  implicit final def CollectionSizeable[C[_], T](implicit ev: C[T] <:< IterableOnce[T]): Sizeable[C[T]] =
    _IterableOnceSizable.asInstanceOf[Sizeable[C[T]]]
}

object syntax {
  object sizeable {
    implicit class SizeableOps[T](private val sizable: T) extends AnyVal {
      @inline def size(implicit ev: Sizeable[T]): Long =
        ev.size(sizable)

      @inline def length(implicit ev: Sizeable[T]): Long =
        ev.size(sizable)
    }
  }
}

import syntax.sizeable._

def ioStatSink[T : Sizeable](): Sink[T, Future[(Long, Long)]] =
  Sink.fold((0L, 0L))((acc, bytes) => (acc._1 + 1L, acc._2 + bytes.length))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多