AVRO-804 included an optimization to Thrift struct field access that's also applicable to protobuf.
I committed this.
I'll commit this soon.
Here's a patch that implements this same optimization for protobuf. Instead of accessing the cache that maps Avro field positions to protobuf field ids once per field the cache is only accessed once per record when reading or writing.