Enrich-My-Library优化

时间:2013-03-07 13:55:42

标签: c# scala optimization extension-methods enrich-my-library

免责声明:我从C#来到Scala,在那里我非常感谢LINQ。 因此,我立刻感觉到家里有迭代器和序列。我错过了“C#风格”的收益,但是我能够通过延续来烹饪我自己...即使它会带来性能损失。

现在,当我在C#中错过了一些集合方法时,我只是将它定义为扩展方法,并且编译器在处理代码方面做得非常好。 在Scala中,我使用 Pimp 丰富我的图书馆方法,但我对表演有点担心。

然而,与我的“屈服迭代器”相反,这是一个公认的常见模式。 Scala编译器是否对其进行了优化,删除了临时对象的创建?

class RichFoo(f: Foo) {
  def baz = f.bar()
  def baz2 = f.bar() * 2
}
object RichFoo {
  implicit def foo2Rich(f: Foo) = new RichFoo(f)
}

// on the caller side
val f : Foo = ....
f.baz
f.baz2
// this translates, literally, to new RichFoo(f).baz, new RichFoo(f).baz2

如果没有,为什么?对我来说,它看起来是一个安全的优化。我可以向正确的方向“暗示”或“强制”编译器吗?有哪些更快的替代方案?

我想在迭代器/迭代中使用我的算法集合模式,所以我可以把它们写成filter / map / etc collection.baz(lambda).bar(lambda2),但我担心它会被证明太“重”。 (与更高效/直接,但丑陋的bar(lambda2, baz(lambda, collection)

相比

1 个答案:

答案 0 :(得分:3)

作为@ om-nom-nom注释,这里的解决方案(在2.10中)是使用隐式值类。

implicit class RichFoo(val f : Foo) extends AnyVal {
  def baz = f.bar()
  def bax = f.bar()
}

RichFoo现在在编译时存在,但在运行时,它被优化为静态方法调用,因此不会造成性能损失。

请参阅Value classes (SIP)

另请参阅Mark Harrah的Introduction to Value Classes,它从使用角度给出了一个很好的概述。