繁体   English   中英

丰富我的图书馆优化

[英]Enrich-My-Library optimization

免责声明:我从C#来到Scala,在这里我非常感谢LINQ。 因此,我立即对迭代器和序列感到宾至如归。 我错过了收益率很高的“ C#风格”,但是我可以继续做自己的事情……即使它付出了性能损失。

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

但是,与我的“ yield迭代器”相反,这是一种公认​​的常见模式。 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) ))

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

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

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

请参阅值类(SIP)

另请参见Mark Harrah的“值类简介”,从用法的角度对它进行了很好的概述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM