Skip to content

Commit c4f6949

Browse files
committed
More benchmarks for Jackson + clean up of benchmark code
1 parent 084a758 commit c4f6949

File tree

8 files changed

+32
-18
lines changed

8 files changed

+32
-18
lines changed

benchmark/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/macros/ArrayOfDoublesBenchmark.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class ArrayOfDoublesBenchmark extends CommonParams {
4040

4141
@Benchmark
4242
def writeJsoniterScalaPrealloc(): Int = writeToPreallocatedArray(obj, preallocatedBuf, 0)
43-
/* FIXME: Play serializes doubles in different format than toString: 0.0 as 0, 7.0687002407403325E18 as 7068700240740332500
43+
/* FIXME: Play serializes doubles in BigDecimal format: 0.0 as 0, 7.0687002407403325E18 as 7068700240740332500
4444
@Benchmark
4545
def writePlayJson(): Array[Byte] = Json.toBytes(Json.toJson(obj))
4646
*/

benchmark/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/macros/ArrayOfEnumsBenchmark.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import java.nio.charset.StandardCharsets._
44

55
import com.github.plokhotnyuk.jsoniter_scala.core._
66
import com.github.plokhotnyuk.jsoniter_scala.macros.CirceEncodersDecoders._
7-
//import com.github.plokhotnyuk.jsoniter_scala.macros.JacksonSerDesers._
7+
import com.github.plokhotnyuk.jsoniter_scala.macros.JacksonSerDesers._
88
import com.github.plokhotnyuk.jsoniter_scala.macros.JsoniterCodecs._
99
import com.github.plokhotnyuk.jsoniter_scala.macros.PlayJsonFormats.enumArrayFormat
1010
import com.github.plokhotnyuk.jsoniter_scala.macros.SuitEnum.SuitEnum
@@ -29,10 +29,10 @@ class ArrayOfEnumsBenchmark extends CommonParams {
2929

3030
@Benchmark
3131
def readCirce(): Array[SuitEnum] = decode[Array[SuitEnum]](new String(jsonBytes, UTF_8)).fold(throw _, x => x)
32-
/* FIXME jackson-module-scala cannot parse string representation of enum values
32+
3333
@Benchmark
3434
def readJacksonScala(): Array[SuitEnum] = jacksonMapper.readValue[Array[SuitEnum]](jsonBytes)
35-
*/
35+
3636
@Benchmark
3737
def readJsoniterScala(): Array[SuitEnum] = readFromArray[Array[SuitEnum]](jsonBytes)
3838

@@ -41,10 +41,10 @@ class ArrayOfEnumsBenchmark extends CommonParams {
4141

4242
@Benchmark
4343
def writeCirce(): Array[Byte] = printer.pretty(obj.asJson).getBytes(UTF_8)
44-
/* FIXME jackson-module-scala store array of objects with "enumClass" field instead of strings
44+
4545
@Benchmark
4646
def writeJacksonScala(): Array[Byte] = jacksonMapper.writeValueAsBytes(obj)
47-
*/
47+
4848
@Benchmark
4949
def writeJsoniterScala(): Array[Byte] = writeToArray(obj)
5050

benchmark/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/macros/ArrayOfFloatsBenchmark.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class ArrayOfFloatsBenchmark extends CommonParams {
4040

4141
@Benchmark
4242
def writeJsoniterScalaPrealloc(): Int = writeToPreallocatedArray(obj, preallocatedBuf, 0)
43-
/* FIXME: Play-JSON serialize double values instead of float
43+
/* FIXME: Play-JSON serialize BigDecimal values instead of float
4444
@Benchmark
4545
def writePlayJson(): Array[Byte] = Json.toBytes(Json.toJson(obj))
4646
*/

benchmark/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/macros/ArrayOfZonedDateTimesBenchmark.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ class ArrayOfZonedDateTimesBenchmark extends CommonParams {
3737

3838
@Benchmark
3939
def writeCirce(): Array[Byte] = printer.pretty(obj.asJson).getBytes(UTF_8)
40-
/* FIXME jackson serializes ZonedDateTime without IANA region
40+
4141
@Benchmark
4242
def writeJacksonScala(): Array[Byte] = jacksonMapper.writeValueAsBytes(obj)
43-
*/
43+
4444
@Benchmark
4545
def writeJsoniterScala(): Array[Byte] = writeToArray(obj)
4646

benchmark/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/macros/CirceEncodersDecoders.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ object CirceEncodersDecoders {
2626
}
2727
implicit val zoneOffsetEncoder: Encoder[ZoneOffset] = Encoder.encodeString.contramap[ZoneOffset](_.toString)
2828
implicit val zoneOffsetDecoder: Decoder[ZoneOffset] = Decoder.decodeString.emap { str =>
29-
Either.catchNonFatal(ZoneOffset.of(str)).leftMap(t => "Suit")
29+
Either.catchNonFatal(ZoneOffset.of(str)).leftMap(t => "ZoneOffset")
3030
}
3131
}

benchmark/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/macros/JacksonSerDesers.scala

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.github.plokhotnyuk.jsoniter_scala.macros
33
import com.fasterxml.jackson.annotation.JsonInclude.Include
44
import com.fasterxml.jackson.core.JsonToken._
55
import com.fasterxml.jackson.core.`type`.TypeReference
6-
import com.fasterxml.jackson.core.{JsonFactory, JsonGenerator, JsonParser, JsonParseException => ParseException}
6+
import com.fasterxml.jackson.core.{JsonFactory, JsonGenerator, JsonParser, JsonToken, JsonParseException => ParseException}
77
import com.fasterxml.jackson.databind.deser.std.StdDeserializer
88
import com.fasterxml.jackson.databind.module.SimpleModule
99
import com.fasterxml.jackson.databind.ser.std.StdSerializer
@@ -12,6 +12,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
1212
import com.fasterxml.jackson.module.afterburner.AfterburnerModule
1313
import com.fasterxml.jackson.module.scala.DefaultScalaModule
1414
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
15+
import com.github.plokhotnyuk.jsoniter_scala.macros.SuitEnum.SuitEnum
1516

1617
import scala.collection.immutable.{BitSet, HashMap, Map}
1718
import scala.collection.mutable
@@ -25,13 +26,16 @@ object JacksonSerDesers {
2526
.addSerializer(classOf[BitSet], new BitSetSerializer)
2627
.addSerializer(classOf[mutable.BitSet], new MutableBitSetSerializer)
2728
.addSerializer(classOf[Array[Byte]], new ByteArraySerializer)
29+
.addSerializer(classOf[SuitEnum], new SuitEnumSerializer)
2830
.addDeserializer(classOf[BitSet], new BitSetDeserializer)
29-
.addDeserializer(classOf[mutable.BitSet], new MutableBitSetDeserializer))
31+
.addDeserializer(classOf[mutable.BitSet], new MutableBitSetDeserializer)
32+
.addDeserializer(classOf[SuitEnum], new SuitEnumDeserializer))
3033
registerModule(new JavaTimeModule())
3134
registerModule(new AfterburnerModule)
3235
configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false)
3336
configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
3437
configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
38+
configure(SerializationFeature.WRITE_DATES_WITH_ZONE_ID, true)
3539
configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true)
3640
setSerializationInclusion(Include.NON_EMPTY)
3741
}
@@ -119,3 +123,16 @@ class CustomMutableMapDeserializer extends
119123
override def getNullValue(ctxt: DeserializationContext): mutable.Map[Int, mutable.OpenHashMap[Long, Double]] =
120124
mutable.Map.empty
121125
}
126+
127+
class SuitEnumSerializer extends JsonSerializer[SuitEnum] {
128+
override def serialize(value: SuitEnum, jgen: JsonGenerator, provider: SerializerProvider): Unit =
129+
jgen.writeString(value.toString)
130+
}
131+
132+
class SuitEnumDeserializer extends JsonDeserializer[SuitEnum] {
133+
override def deserialize(jp: JsonParser, ctxt: DeserializationContext): SuitEnum =
134+
jp.getCurrentToken match {
135+
case JsonToken.VALUE_STRING => SuitEnum.withName(jp.getValueAsString)
136+
case _ => ctxt.handleUnexpectedToken(classOf[SuitEnum], jp).asInstanceOf[SuitEnum]
137+
}
138+
}

benchmark/src/test/scala/com/github/plokhotnyuk/jsoniter_scala/macros/ArrayOfEnumsBenchmarkSpec.scala

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@ class ArrayOfEnumsBenchmarkSpec extends BenchmarkSpecBase {
66
"ArrayOfEnumsBenchmark" should {
77
"deserialize properly" in {
88
benchmark.readCirce().deep shouldBe benchmark.obj.deep
9-
//FIXME jackson-module-scala cannot parse string representation of enum values
10-
//benchmark.readJacksonScala().deep shouldBe benchmark.obj.deep
9+
benchmark.readJacksonScala().deep shouldBe benchmark.obj.deep
1110
benchmark.readJsoniterScala().deep shouldBe benchmark.obj.deep
1211
benchmark.readPlayJson().deep shouldBe benchmark.obj.deep
1312
}
1413
"serialize properly" in {
1514
toString(benchmark.writeCirce()) shouldBe benchmark.jsonString
16-
//FIXME jackson-module-scala store array of objects with "enumClass" field instead of strings
17-
//toString(benchmark.writeJacksonScala()) shouldBe benchmark.jsonString
15+
toString(benchmark.writeJacksonScala()) shouldBe benchmark.jsonString
1816
toString(benchmark.writeJsoniterScala()) shouldBe benchmark.jsonString
1917
toString(benchmark.preallocatedBuf, benchmark.writeJsoniterScalaPrealloc()) shouldBe benchmark.jsonString
2018
toString(benchmark.writePlayJson()) shouldBe benchmark.jsonString

benchmark/src/test/scala/com/github/plokhotnyuk/jsoniter_scala/macros/ArrayOfZonedDateTimesBenchmarkSpec.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ class ArrayOfZonedDateTimesBenchmarkSpec extends BenchmarkSpecBase {
1212
}
1313
"serialize properly" in {
1414
toString(benchmark.writeCirce()) shouldBe benchmark.jsonString
15-
//FIXME jackson serializes ZonedDateTime without IANA region
16-
//toString(benchmark.writeJacksonScala()) shouldBe benchmark.jsonString
15+
toString(benchmark.writeJacksonScala()) shouldBe benchmark.jsonString
1716
toString(benchmark.writeJsoniterScala()) shouldBe benchmark.jsonString
1817
toString(benchmark.preallocatedBuf, benchmark.writeJsoniterScalaPrealloc()) shouldBe benchmark.jsonString
1918
toString(benchmark.writePlayJson()) shouldBe benchmark.jsonString

0 commit comments

Comments
 (0)