Scala隐式类型转换的性能影响是什么?

在Scala中,使用隐式类型转换来增强类的功能与其他可能的实现选择是否有显着的CPU或内存影响?

例如,考虑一个傻的String处理函数。此实现使用字符串连接:

object Funky {
  def main(args: Array[String]) {
    args foreach(arg => println("Funky " + arg))
  }
}

此实现使用隐式类型转换隐藏了成员方法后面的并置:

class FunkyString(str: String) {
  def funkify() = "Funky " + str
}

object ImplicitFunky {
  implicit def asFunkyString(str: String) = new FunkyString(str)

  def main(args: Array[String]) {
    args foreach(arg => println(arg.funkify()))
  }
}

两者做同样的事情:

scala> Funky.main(Array("Cold Medina", "Town", "Drummer"))        
Funky Cold Medina
Funky Town
Funky Drummer

scala> ImplicitFunky.main(Array("Cold Medina", "Town", "Drummer"))
Funky Cold Medina
Funky Town
Funky Drummer

有任何性能差异吗?几个具体考虑:

Scala内联对asFunkyString方法的隐式调用吗?

Scala实际上是为每个arg创建一个新的包装FunkyString对象,还是可以优化额外的对象分配?

假设FunkyString有3个不同的方法(funkify1,funkify2和funkify3),foreach的主体连续调用每个方法:

println(arg.funkify1())
println(arg.funkify2())
println(arg.funkify3())

Scala会重复转换3次,还是会优化掉冗余转换,只为每次循环迭代做一次?

假设我明确地捕获在另一个变量的转换,像这样:

val fs = asFunkyString(arg)
println(fs.funkify1())
println(fs.funkify2())
println(fs.funkify3())

这是否改变了情况?

实际上,隐式转换的广泛使用是潜在的性能问题,还是通常是无害的?

我试图使用优秀的Scala-Benchmark-Template设置一个微基准。

很难写出一个有意义的(未通过JIT优化的)基准测试只测试隐式转换,所以我不得不增加一点开销。

这里是代码:

class FunkyBench extends SimpleScalaBenchmark {
  val N = 10000
  def timeDirect( reps: Int ) = repeat(reps) {
    var strs = List[String]()
    var s = "a"
    for( i <- 0 until N ) {
      s += "a"
      strs ::= "Funky " + s 
    }
    strs
  }
  def timeImplicit( reps: Int ) = repeat(reps) {
    import Funky._
    var strs = List[String]()
    var s = "a"
    for( i <- 0 until N ) {
      s += "a"
      strs ::= s.funkify
    }
    strs
  }
}

这里是结果:

[info] benchmark  ms linear runtime
[info]    Direct 308 =============================
[info]  Implicit 309 ==============================

我的结论:在任何非凡的代码中,隐式转换(对象创建)的影响是不可衡量的。

编辑:我使用scala 2.9.0和java 1.6.0_24(在服务器模式下)

http://stackoverflow.com/questions/6381940/what-is-the-performance-impact-of-scala-implicit-type-conversions

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Scala隐式类型转换的性能影响是什么?