Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,17 @@ abstract class ArrayOfUUIDsBenchmark extends CommonParams {
@Param(Array("1", "10", "100", "1000", "10000", "100000", "1000000"))
var size: Int = 1000
var obj: Array[UUID] = _
var strings: Array[String] = _
var res: Array[UUID] = _
var jsonString: String = _
var jsonBytes: Array[Byte] = _
var preallocatedBuf: Array[Byte] = _

@Setup
def setup(): Unit = {
obj = (1 to size).map(i => new UUID(i * 6971258582664805397L, i * 6971258582664805397L)).toArray
strings = obj.map(_.toString)
res = new Array[UUID](size)
jsonString = obj.mkString("[\"", "\",\"", "\"]")
jsonBytes = jsonString.getBytes(UTF_8)
preallocatedBuf = new Array[Byte](jsonBytes.length + 100/*to avoid possible out of bounds error*/)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,101 @@ class ArrayOfUUIDsReading extends ArrayOfUUIDsBenchmark {

@Benchmark
def weePickle(): Array[UUID] = FromJson(jsonBytes).transform(ToScala[Array[UUID]])

@Benchmark
def javaCopy(): Array[UUID] = {
val len = res.length
var i = 0
while (i < len) {
res(i) = obj(i)
i += 1
}
res
}

@Benchmark
def javaOrig(): Array[UUID] = {
val len = res.length
var i = 0
while (i < len) {
res(i) = UUID.fromString(strings(i))
i += 1
}
res
}

@Benchmark
def javaFast(): Array[UUID] = {
val len = res.length
var i = 0
while (i < len) {
res(i) = fromString(strings(i))
i += 1
}
res
}

def fromString(name: String): UUID = {
val ns = nibbles
var msb, lsb = 0L
if (name.length == 36 && {
val ch1: Long = name.charAt(8)
val ch2: Long = name.charAt(13)
val ch3: Long = name.charAt(18)
val ch4: Long = name.charAt(23)
(ch1 << 48 | ch2 << 32 | ch3 << 16 | ch4) == 0x2D002D002D002DL
} && {
val msb1 = parse4Nibbles(name, ns, 0)
val msb2 = parse4Nibbles(name, ns, 4)
val msb3 = parse4Nibbles(name, ns, 9)
val msb4 = parse4Nibbles(name, ns, 14)
msb = msb1 << 48 | msb2 << 32 | msb3 << 16 | msb4
(msb1 | msb2 | msb3 | msb4) >= 0
} && {
val lsb1 = parse4Nibbles(name, ns, 19)
val lsb2 = parse4Nibbles(name, ns, 24)
val lsb3 = parse4Nibbles(name, ns, 28)
val lsb4 = parse4Nibbles(name, ns, 32)
lsb = lsb1 << 48 | lsb2 << 32 | lsb3 << 16 | lsb4
(lsb1 | lsb2 | lsb3 | lsb4) >= 0
}) new UUID(msb, lsb)
else UUID.fromString(name)
}

private[this] def parse4Nibbles(name: String, ns: Array[Byte], pos: Int): Long = {
val ch1 = name.charAt(pos)
val ch2 = name.charAt(pos + 1)
val ch3 = name.charAt(pos + 2)
val ch4 = name.charAt(pos + 3)
if ((ch1 | ch2 | ch3 | ch4) > 0xFF) -1
else ns(ch1) << 12 | ns(ch2) << 8 | ns(ch3) << 4 | ns(ch4)
}

private final val nibbles: Array[Byte] = {
val ns = new Array[Byte](256)
java.util.Arrays.fill(ns, -1: Byte)
ns('0') = 0
ns('1') = 1
ns('2') = 2
ns('3') = 3
ns('4') = 4
ns('5') = 5
ns('6') = 6
ns('7') = 7
ns('8') = 8
ns('9') = 9
ns('A') = 10
ns('B') = 11
ns('C') = 12
ns('D') = 13
ns('E') = 14
ns('F') = 15
ns('a') = 10
ns('b') = 11
ns('c') = 12
ns('d') = 13
ns('e') = 14
ns('f') = 15
ns
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ class ArrayOfUUIDsReadingSpec extends BenchmarkSpecBase {
benchmark.dslJsonScala() shouldBe benchmark.obj
benchmark.jacksonScala() shouldBe benchmark.obj
benchmark.jsoniterScala() shouldBe benchmark.obj
benchmark.javaCopy() shouldBe benchmark.obj
benchmark.javaOrig() shouldBe benchmark.obj
benchmark.javaFast() shouldBe benchmark.obj
benchmark.playJson() shouldBe benchmark.obj
benchmark.sprayJson() shouldBe benchmark.obj
benchmark.uPickle() shouldBe benchmark.obj
Expand Down