为什么通过Avro编组/解组JSON的速度如此之慢?

时间:2015-03-20 03:12:23

标签: 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

最后两个(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
 }

我希望有人可以指出我做错了什么。我认为使用编译后的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

谢谢!

0 个答案:

没有答案