You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Henrique Mendonça (JIRA)" <ji...@apache.org> on 2015/02/03 02:29:35 UTC

[jira] [Updated] (THRIFT-2368) New option: reuse-objects for Java generator

     [ https://issues.apache.org/jira/browse/THRIFT-2368?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Henrique Mendonça updated THRIFT-2368:
--------------------------------------
    Fix Version/s:     (was: 1.0)
                   0.9.3

> New option: reuse-objects for Java generator
> --------------------------------------------
>
>                 Key: THRIFT-2368
>                 URL: https://issues.apache.org/jira/browse/THRIFT-2368
>             Project: Thrift
>          Issue Type: New Feature
>          Components: Java - Compiler
>    Affects Versions: 0.9.1
>            Reporter: adam
>            Assignee: Henrique Mendonça
>            Priority: Minor
>             Fix For: 0.9.3
>
>         Attachments: thrift-0.9.1-java-reuse-objects-with-junits.patch, thrift-reuse-objects-fixes.patch
>
>
> https://github.com/apache/thrift/pull/81
> For applications serializing and deserializing millions of transactions it is important to avoid unnecessary memory allocations - the allocated and abandoned objects needs to be collected and deleted by GC, which creates "stop-the-world" pauses. The new compiler option forces thrift compiler to generate code which is reusing existing objects for deserialization (this is up to caller to make sure that read data will fit). Without that option compiler generates the same code as originally.
> code generated by original compiler (0.9.1):
> =========================================================================================================
> {code}
>          case 1: // HEADER
>             if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
>               struct.header = new com.gtech.ngin.ncp.libs.thrift.binary.BinaryHeaderStruct();
>               struct.header.read(iprot);
>               struct.setHeaderIsSet(true);
>             } else { 
>               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
>             }
>             break;
>           case 2: // KEYS
>             if (schemeField.type == org.apache.thrift.protocol.TType.SET) {
>               {
>                 org.apache.thrift.protocol.TSet _set0 = iprot.readSetBegin();
>                 struct.keys = new HashSet<com.gtech.ngin.ncp.libs.thrift.binary.BinaryKeyStruct>(2*_set0.size);
>                 for (int _i1 = 0; _i1 < _set0.size; ++_i1)
>                 {
>                   com.gtech.ngin.ncp.libs.thrift.binary.BinaryKeyStruct _elem2;
>                   _elem2 = new com.gtech.ngin.ncp.libs.thrift.binary.BinaryKeyStruct();
>                   _elem2.read(iprot);
>                   struct.keys.add(_elem2);
>                 }
>                 iprot.readSetEnd();
>               }
>               struct.setKeysIsSet(true);
>             } else { 
>               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
>             }
>             break;
> {code}
> code generated with enabled "java:reuse-objects" option:
> =========================================================================================================
> {code}
>           case 1: // HEADER
>             if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
>               if (struct.header == null) {
>                 struct.header = new com.gtech.ngin.ncp.libs.thrift.binary.BinaryHeaderStruct();
>               }
>               struct.header.read(iprot);
>               struct.setHeaderIsSet(true);
>             } else {
>               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
>             }
>             break;
>           case 2: // KEYS
>             if (schemeField.type == org.apache.thrift.protocol.TType.SET) {
>               {
>                 org.apache.thrift.protocol.TSet _set0 = iprot.readSetBegin();
>                 if (struct.keys == null) {
>                   struct.keys = new HashSet<com.gtech.ngin.ncp.libs.thrift.binary.BinaryKeyStruct>(2*_set0.size);
>                 }
>                 com.gtech.ngin.ncp.libs.thrift.binary.BinaryKeyStruct _elem1 = new com.gtech.ngin.ncp.libs.thrift.binary.BinaryKeyStruct();
>                 for (int _i2 = 0; _i2 < _set0.size; ++_i2)
>                 {
>                   if (_elem1 == null) {
>                     _elem1 = new com.gtech.ngin.ncp.libs.thrift.binary.BinaryKeyStruct();
>                   }
>                   _elem1.read(iprot);
>                   struct.keys.add(_elem1);
>                 }
>                 iprot.readSetEnd();
>               }
>               struct.setKeysIsSet(true);
>             } else {
>               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
>             }
>             break;
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)