[
https://issues.apache.org/jira/browse/THRIFT-2368?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Henrique Mendonça resolved THRIFT-2368.
---------------------------------------
Resolution: Fixed
> 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)