GitHub user adam-aph opened a pull request:

    https://github.com/apache/thrift/pull/81

    New option: reuse-objects for Java generator

    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):
    ```
             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 generated with enabled "java:reuse-objects" option:
    ```
              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;
    ```


You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/adam-aph/thrift master

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/thrift/pull/81.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #81
    
----
commit 72f4e4dd00a4403b6147c8edb1c3f994b45a839a
Author: adam-aph <adam.p.haj...@gmail.com>
Date:   2014-02-19T15:42:53Z

    New option: reuse-objects

----


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. To do so, please top-post your response.
If your project does not have this feature enabled and wishes so, or if the
feature is enabled but not working, please contact infrastructure at
infrastruct...@apache.org or file a JIRA ticket with INFRA.
---

Reply via email to