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