为什么通过Avro编组/解组JSON这么慢?

nop*_*lay 8 json scala avro

我是Avro的新手,使用1.7.7.

我有一个编译的模式.

我试图通过JSON进行编组,认为我会利用Avro提供的验证.

然而,Avro编组很慢(至少我正在这样做).

以下是通过我的对象的10,000次迭代.该对象具有嵌套对象和嵌套的对象数组,因此它很复杂.虽然它很复杂,但没有很多数据元素.在阵列中,我有3个项目,所以那里不是很多.

以下是我的表现测试结果:

CONVERTING TO JSON (THROUGH AVRO) AVG: 74 MICROS
CONVERTING FROM JSON (THROUGH AVRO) AVG: 433 MICROS
CONVERTING TO JSON (JACKSON STREAMING) AVG: 16 MICROS
CONVERTING FROM JSON (JACKSON STREAMING) AVG: 9 MICROS
Run Code Online (Sandbox Code Playgroud)

最后两个(JACKSON STREAMING)我使用的是纯Jackson流式API而不是AVRO.性能提升是荒谬的.

我觉得我在这里做错了什么.以下是处理JSON < - > AVRO内容的代码片段:

 val spanDatumReader = new SpecificDatumReader[Span](Span.getClassSchema)
 val spanDatumWriter = new SpecificDatumWriter[Span](Span.getClassSchema)

 def fromJson(spanJson:String):Span = {

  val spanJsonDecoder = DecoderFactory.get.jsonDecoder(Span.getClassSchema, spanJson)
  spanDatumReader.read(null, spanJsonDecoder)
 }

 def toJson(span:Span):String = {

    val writer = new StringWriter()
    val jsonGenerator = jsonFactory.createJsonGenerator(writer)
    val spanJsonEncoder = EncoderFactory.get.jsonEncoder(Span.getClassSchema, jsonGenerator)
    spanDatumWriter.write(span, spanJsonEncoder)
    spanJsonEncoder.flush()
    jsonGenerator.close()
    writer.toString
 }
Run Code Online (Sandbox Code Playgroud)

我希望有人可以指出我做错了什么.我认为使用编译的Schema,编组/解组应该接近手工操作,但到目前为止情况并非如此:(

只是更新,我运行了100,000次以下结果.更近(可能JVM启动或其他东西升温),但仍然有很大的不同:

CONVERTING TO JSON (THROUGH AVRO) AVG: 16 MICROS
CONVERTING FROM JSON (THROUGH AVRO) AVG: 21 MICROS
CONVERTING TO JSON (JACKSON STREAMING) AVG: 3 MICROS
CONVERTING FROM JSON (JACKSON STREAMING) AVG: 2 MICROS
Run Code Online (Sandbox Code Playgroud)

谢谢!