Сравнение памяти и производительности массива BigInt и байтов в scala - PullRequest
1 голос
/ 29 марта 2019

Мне нужно использовать тип, который может эффективно использовать адреса Ipv4 и Ipv6 в памяти (в scala). Как и они должны быть исполнителями. Я вижу два варианта: использование типа Scala BigInt или байтового массива. Что память / перф бьют в обоих случаях?

1 Ответ

0 голосов
/ 29 марта 2019

BigInteger в Java занимает 5 * 4 bytes для полей 4 int плюс массив int. BigInt от Scala - это просто обёртка над BigInteger, так что это будет похоже. Таким образом, использование массива Byte определенно займет меньше места.

Я мог бы также рассмотреть возможность использования псевдонимов типов с сопутствующим объектом и неявными расширениями, чтобы сохранить безопасность типов и расширенный API без дополнительных затрат (он все равно будет таким же, как и Array[Byte].

trait IP

type IPv4 = Array[Byte] with IP //adding "with IP" would make sure compiler won't accept plain Array[Byte] when type IPv4 is needed

type IPv6 = Array[Byte] with IP

object IPv4 { //create similar for IPv6

  def apply(ip: String) = {
    ip.split("\\.").map(_.toByte).asInstanceOf[IPv4] //you can create IPv4("127.0.0.1")
  }

  object Implicits {
    implicit class RichIPv4(ip: IPv4) {
        def show(): String = ip.map(_.toString).mkString(".") //add method to show as string
      def verify(): Boolean = ??? //additional methods
    }
  }

}

import IPV4.Implicits._

def printIP(ip: IPv4) = println(ip.show) //Will only accept arrays created by IPv4.apply

printIP(IPv4("127.0.0.1")) //ok
printIP(Array[Byte](127,0,0,1)) //won't compile

В качестве альтернативы вы должны взглянуть на большую библиотеку scala-newtype , которая делает подобные вещи, но без дополнительного шаблона.

...