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. ---