0

免責事項: 私は C# から Scala にたどり着きました。C# では LINQ を高く評価していました。したがって、私はすぐにイテレータとシーケンスに慣れました。「C# スタイル」の利回りを逃しましたが、継続を使用して自分でクックすることができました...パフォーマンスが低下したとしても。

今では、C# でコレクションに対するメソッドが欠落している場合、それを拡張メソッドとして定義するだけで、コンパイラはコードを効率的に処理するという非常に優れた仕事をしてくれます。Scala では、Pimpのエンリッチ My Library アプローチを使用していますが、パフォーマンスが少し心配です。

ただし、私の「yield iterator」とは対照的に、これは認識された一般的なパターンです。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

そうでない場合、なぜですか?私にとっては、適切で安全な最適化のように見えます。コンパイラを正しい方向に「ヒント」または「強制」できますか? より高速な代替手段はどれですか?

イテレータ/イテラブルを介してアルゴリズムのコレクションにパターンを使用したいので、それらをフィルター/マップ/などとして記述できますcollection.baz(lambda).bar(lambda2)が、「重すぎる」ことが判明するのではないかと心配しています。(より効率的/直接的ですが、醜い と比較してbar(lambda2, baz(lambda, collection))

4

1 に答える 1

3

@om-nom-nom がコメントしているように、ここ (2.10) での解決策は、暗黙の値クラスを使用することです。

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

RichFoo現在はコンパイル時に存在しますが、実行時にこれは静的メソッド呼び出しに最適化されるため、パフォーマンスが低下することはありません。

値クラス (SIP)を参照してください

Mark Harrah のIntroduction to Value Classesも参照してください。これは、使用法の観点から概要を説明しています。

于 2013-03-07T14:01:59.740 に答える