6

Javaのようなクラスが必要だとしますDate。その唯一のデータメンバーは、1970年以降のミリ秒を表すlongです。

新しいScalaタイプを作成するだけで、パフォーマンス上のメリットが得られるでしょうか。

type PrimitiveDate = Long

次に、intを使用して行われるように、暗黙的な変換を使用してメソッドを追加できますRichInt。プリミティブ型のリッチクラスへのこの「ボクシング」には、オーバーヘッド(クラスの作成)が含まれますか?基本的には静的メソッドを使用できます

def addMonth(date: PrimitiveDate, months: Int): PrimitiveDate = date + 2592000000 * months

そして、型システムに、コード内に表示されたときに適用する必要があることを理解さd addMonth 5 せます。

編集

書き込みによって作成したエイリアスtype PrimitiveDate = Longは、scalaコンパイラによって強制されていないようです。Scalaで強制型を作成する唯一の方法は、Longを囲む適切なクラスを作成することですか?

プリミティブ型の強制型エイリアスを作成できると思いますか?

4

3 に答える 3

12

エスケープ分析は、最新のJVMがメソッドを呼び出すために実際にリッチラッパーを作成する必要がないことを意味するはずです。addMonth

これが実際にどの程度発生するかは、JVMがこれらのメソッドがオブジェクト作成に追加することを決定するランタイムホットスポットの量に明らかに依存します。エスケープ分析が行われていない場合、明らかに、JVMはLongラッパークラスの新しいインスタンスで(あなたが言うように)「ボックス化」する必要があります。これには「クラスの作成」は含まれません。「クラスのインスタンスの作成」が含まれます。このインスタンスは、短命であるとすぐにGC-dになるため、オーバーヘッド(小さいながら)は次のようになります。

  • インスタンスのメモリ割り当て
  • インスタンスのGC-ing

これらは明らかに、(タイトなループで)ガベージの作成を最小限に抑えようとしている非常に低レイテンシのコードを確実に記述している場合にのみ、あらゆる種類の問題になります。これが事実かどうかを知っているのはあなただけです。

アプローチがあなたのために働くかどうか(そしてエスケープ分析があなたの助けになるかどうか)に関しては、あなたは野生でテストしなければならないでしょう。マイクロベンチマークは、この種のことを書くのが難しいことで有名です。


これらの型エイリアスがパブリックAPIの一部であることがあまり好きではない理由は、scalaが実際に私が望むほど厳密にそれらを強制しないためです。例えば:

type PrimitiveDate = Long
type PrimitiveSpeed = Long
type Car = String
type Meeting = String

var maxSpeeds : Map[Car, PrimitiveSpeed] = Map.empty

//OOPS - much too easy to accidentally send the wrong type
def setDate(meeting : Meeting, date : PrimitiveDate) = maxSpeeds += (meeting -> date)
于 2010-10-20T10:15:26.070 に答える
4

与えられた例では実際に新しいタイプを作成していません。これは単に既存のLongタイプのエイリアスです。

これは、扱いにくいネストされた接続を処理するために私が頻繁に使用する手法です。たとえば、さまざまなパラメータを何度もtype Grid = Seq[Seq[Int]]指定する必要がないように、エイリアスを作成します。Seq[Seq[Int]]

コードが自己文書化されているという利点はありますが、メソッドを使用するメソッドLongaを渡すことは非常に喜ばしいことです。PrimitiveDate

型安全性と便利なパターンマッチングが適用された新しい型を本当に作成したい場合は、ケースクラスを使用します。

case class PrimitiveDate(value:Long)

また、便宜上、暗黙のLong=>PrimitiveDate変換を提供することもできます。

于 2010-10-20T12:59:46.153 に答える
4

この質問をしてから11か月後、Miles Sabinは、Scalaでボックス化されていないニュータイプを作成する非常にシンプルでエレガントでパフォーマンスの高い方法を発見しまし。タイプエイリアスとは異なり、タイプタグが適用されます。プリミティブ型は、特殊化を提供するために最小限の定型文(プリミティブごとに1行)を必要とします。

1年後、彼はこれのより洗練された堅牢なバージョンShapelessに追加しました。コンセプトはシンプルで簡潔なので、優れたライブラリの残りの部分が必要ない場合は、Shapelessを追加せずにプロジェクトで複製できます。

もちろん、あなたとあなたの質問に答えた人々の両方がおそらくこれを知っていますが、これはまだ重要な質問なので、ここに追加する価値があります。

于 2015-08-24T16:00:52.410 に答える