Frage

Angenommen, ich eine Klasse wie Java Date haben will. Seine einzige Datenelement eine lange, die die Millisekunden seit 1970 darstellt.

Würde / Könnte es jeder Performance-Vorteil sein, nur einen neuen Scala Art machen:

type PrimitiveDate = Long

Dann können Sie Methoden hinzufügen, indem implizite Konvertierung verwenden, wie es für int mit RichInt erfolgt. Ist diese „Box“ des primitiven Typs in eine reiche Klasse beinhaltet einen zusätzlichen Overhead (Klassenerstellung)? Im Grunde könnte man einfach eine statische Methode hat

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

und lassen Sie die Art System Figur heraus, dass es angewandt werden muss, wenn d addMonth 5 erscheint in Ihrem Code.

Bearbeiten

Es scheint, dass die Alias ??Sie erstellen, indem Sie type PrimitiveDate = Long Schreiben nicht von der scala Compiler erzwungen wird. Ist eine richtige Klasse zu schaffen, umschließt die Lange, der einzige Weg, eine erzwungene Typ in Scala zu schaffen?

Wie nützlich sind für Sie in der Lage, eine erzwungene Art Alias ??für primitive Typen zu erstellen?

War es hilfreich?

Lösung

Nun, Escape-Analyse bedeuten soll, dass die jüngste JVMs müssen Ihre reichen Wrapper , um die addMonth Methode aufrufen eigentlich gar nicht schaffen.

Das Ausmaß, in dem diese in der Praxis tatsächlich auftritt hängt offensichtlich ab, wie viel von einer Laufzeit Hotspot die JVM entscheidet, dass diese Methoden hinzufügen, in der Objekterstellung. Wenn Escape-Analyse ist nicht passiert, offensichtlich wird die JVM müssen „Box“ die Long in einer neuen Instanz der Wrapper-Klasse (wie Sie sagen). Sie reagiert nicht „Klasse Schöpfung“ - es würde bedeuten, „eine Instanz einer Klasse erstellen“. Diese Instanz, kurzlebig zu sein, würde dann GC-d sofort sein, so dass der Overhead (während klein) ist:

  • Speicherzuweisung für die Instanz
  • GC-ing die Instanz

Diese sind offenbar nur gehen, jede Art von Problem sein, wenn Sie auf jeden Fall sehr geringe Latenz Code zu schreiben, wo Sie versuchen, Müll Schöpfung zu minimieren (in einer engen Schleife). Nur Sie wissen, ob dies der Fall ist.

Als ob der Ansatz für Sie arbeiten wird (und Escape-Analyse zu Hilfe kommen), dann würden Sie zu Test in der freien Natur haben. Mikro-Benchmarks sind notorisch schwierig für diese Art der Sache zu schreiben.


Der Grund, warum ich wie diese Art Aliase nicht ganz tun einer öffentlichen API als Teil ist, dass scala nicht wirklich sie erzwingen so streng wie Ich mag würde. Zum Beispiel:

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)

Andere Tipps

Sie haben eigentlich keine neue Art im gegebenen Beispiel erstellt, es ist einfach ein Alias ??für den bereits bestehenden Lang Typen.

Es ist eine Technik, die ich sehr oft verwenden, um mit unhandlichen verschachtelten Verbindungen zu behandeln. Zum Beispiel würde ich alias type Grid = Seq[Seq[Int]] zu vermeiden, dass Seq[Seq[Int]] immer und immer wieder für verschiedene Parameter angeben.

Sie können ganz glücklich ein Long ein Verfahren passieren eine PrimitiveDate Methode nehmen, obwohl Sie hat den Vorteil, dass der Code ist viel besser selbst dokumentiert.

Wenn Sie wirklich wollen, einen neuen Typen mit erzwungenen Typsicherheit und bequemer Musteranpassung erstellen, würde ich eine Fall-Klasse verwenden:

case class PrimitiveDate(value:Long)

und möglicherweise sogar bietet eine implizite Long => PrimitiveDate Umwandlung für die Bequemlichkeit.

11 Monate, nachdem Sie diese Frage gestellt, entdeckt Miles Sabin eine sehr einfache, elegante und performante Art und Weise unboxed newtypes in Scala. Im Gegensatz zu Typ-Aliasnamen sind Typ-Tags erzwungen. Urtyp benötigt minimale vorformulierten (eine Zeile pro primitiven) Spezialisierung zu schaffen.

Ein Jahr später, er hat ein mehr poliert und robuste Version dieser Shapeless . Das Konzept ist einfach und prägnant genug, ohne das Hinzufügen Shapeless in einem Projekt dupliziert werden, wenn Sie nicht den Rest der ausgezeichneten Bibliothek wollen.

Natürlich, Sie und die Menschen, die Ihre Frage wahrscheinlich wissen diese beantwortet, aber es lohnt Zugabe von hier, weil dies immer noch eine wichtige Frage ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top