簡體   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