ASF GitHub Bot commented on THRIFT-4555:

bpodgursky opened a new pull request #1540: THRIFT-4555 Optionally disable 
copies of binary fields in Java constructors, getters, and setters
URL: https://github.com/apache/thrift/pull/1540
   THRIFT-2233 added safeguards when working with binary fields by performing 
TBaseHelper.copyBinary on the input bytes in relevant constructors, getters and 
setters in the Java client.  While this is safer, it incurs a heavy overhead 
cost in GC churn by unnecessarily creating and destroying byte arrays when the 
input does happen to be safe. 
   This PR introduces a flag to disable these copies of binary fields, to 
improve performance in situations where developers are sure that the input (or 
output) will not later be mutated.
   This builds without issue for me locally.  This does not currently have any 
tests; I can add tests if this new flag is plausibly acceptable to the 

This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:

> Getter of binary field in Java creates unnecessary copy
> -------------------------------------------------------
>                 Key: THRIFT-4555
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4555
>             Project: Thrift
>          Issue Type: Bug
>          Components: Java - Compiler
>    Affects Versions: 0.11.0
>            Reporter: Joel Croteau
>            Priority: Major
> The get[field] method in generated Java code generates a new copy of a binary 
> field every time it is called. This seems incredibly inefficient. Take a 
> simple example struct:
> {code:java}
> struct StructWithBinary {
>        1: required binary field;
> }
> {code}
> a portion of the generated code for this is:
> {code:java}
>   public byte[] getField() {
>     setField(org.apache.thrift.TBaseHelper.rightSize(field));
>     return field == null ? null : field.array();
>   }
> ...
>   public StructWithBinary setField(java.nio.ByteBuffer field) {
>     this.field = org.apache.thrift.TBaseHelper.copyBinary(field);
>     return this;
>   }
> {code}
> So whenever getField is called, setField calls copyBinary and generates 
> another copy. This adds quite a lot of overhead to the getter here and should 
> be fixed.

This message was sent by Atlassian JIRA

Reply via email to