Накладные расходы «бокс» примитивных типов с помощью непливых в Scala

StackOverflow https://stackoverflow.com/questions/3976391

  •  09-10-2019
  •  | 
  •  

Вопрос

Предположим, я хочу иметь класс, как Java Date. Отказ Его единственным членом данных является длинный, который представляет миллисекунды с 1970 года.

Будет / могло бы быть любым преимуществом производительности только для того, чтобы сделать новый тип Scala:

type PrimitiveDate = Long

Затем вы можете добавить методы, используя неявное преобразование, как это сделано для INT с RichInt. Отказ Делает ли этот «бокс» примитивного типа в богатый класс, включает в себя любые накладные расходы (создание класса)? В основном вы можете просто иметь статический метод

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

и пусть система типа выясняется, что она должна применяться, когда d addMonth 5отображается внутри вашего кода.

Редактировать

Похоже, что псевдоним, который вы создаете, написав type PrimitiveDate = Long не используется подкомпонетором Scala. Создает правильный класс, охватывающий длинный, единственный способ создать принудительный тип в Scala?

Насколько полезно иметь возможность создать псевдоним насильственным типом для примитивных типов?

Это было полезно?

Решение

Хорошо, Анализ побега должно означать, что самые последние JVMS на самом деле не должны создавать богатая обертка чтобы позвонить addMonth метод.

Степень, к которой это на самом деле происходит на практике Очевидно, будет зависеть от того, сколько времени выполнения горячая точка JVM решает, что эти методы добавляют в создание объекта. Когда анализ побега не происходит, очевидно, JVM придется «коробку» (как вы говорите) Long в новом экземпляре класса обертки. Он не включает в себя «создание класса» - это будет включать «создание экземпляра класса». Этот экземпляр, будучи недолгой, тогда будет немедленно, так что накладные расходы (в то время как маленькие):

  • Распределение памяти для экземпляра
  • 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)

Другие советы

Вы на самом деле не создали новый тип в данном примере, это просто псевдоним для ранее существующего длинного типа.

Это техника, которую я часто использую для борьбы с громоздкими вложенными соединениями. Например, я бы псевдоним type Grid = Seq[Seq[Int]] Чтобы избежать необходимости указывать Seq[Seq[Int]] снова и снова для различных параметров.

Вы можете довольно счастливо пройти Long к методу, принимающему PrimitiveDate метод, хотя вы делать Имейте то преимущество, что код гораздо лучше самодостаточно.

Если вы действительно хотите создать новый тип с принудительным типовым безопасным и удобным сопоставлением шаблона, я бы использовал класс регистра:

case class PrimitiveDate(value:Long)

И, потенциально, даже давайте неявную длинную => примитивное преобразование для удобства.

Через 11 месяцев после того, как вы задали этот вопрос, Майлз Сабин обнаружил очень простой, элегантный и исполнительный способ создания Unboxed Newtypes в Scala. В отличие от псевдонимов типа, теги типа применяются. Примитивные типы нуждаются в минимальной котельной (одна строка на примитив) для обеспечения специализации.

Год спустя он добавил Более полированная и надежная версия это до Безразличный. Отказ Концепция проста и достаточно лаконична, чтобы быть дублированным в проекте, не добавляя щелков, если вы не хотите, чтобы остальная часть этой отличной библиотеки.

Конечно, и вы, и люди, которые ответили на ваш вопрос, вероятно, знают это, но стоит добавить здесь, потому что это все еще важный вопрос.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top