我在网上的不同地方看到了一些有关此信息的相互矛盾的信息,所以真正了解的人会非常感谢和权威回答。
假设,我正在将某些内容序列化为avro:
class StuffToAvro {
private final Schema schema;
StuffToAvro(Schema schema) { this.schema = schema }
void apply(GenericRecord stuff, OutputStream out) {
final Encoder encoder = EncoderFactory.get.binaryEncoder(out, null);
final GenericDatumWriter writer = new GenericDatumWriter(schema);
writer.write(stuff, encoder):
}
}
问题是我是否可以/应该通过重用编码器和编写器来优化它,如果我应该,那么正确的方法是什么:我可以先预先编写作者并使其成为final
例如,还是需要ThreadLocal
?
关于编码器的类似问题:我应该记住上一个实例并将其传递给getBinaryEncoder
以重复使用,还是需要ThreadLocal
。
在每种情况下,如果答案是ThreadLocal
,我还想知道这种优化是否值得复杂:每次创建一个全新的编写器和/或编码器实际上是昂贵的,而不是重用它们?
另外,我假设,无论我得到什么答案,也适用于阅读/解码。是吗?
欣赏任何指针。
谢谢!
答案 0 :(得分:0)
为此post
是的,可以在多个线程中使用DatumReader实例。编码器 和Decoder不是线程安全的,但是DatumReader和DatumWriter是安全的。
编写器也是线程安全的。
是,重新使用单个GenericDatumWriter写入多个对象 应该提高性能。