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 <[email protected]>
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
[email protected] or file a JIRA ticket with INFRA.
---