[YANGTOOLS-1486] Reduce AbstractPrerequisite footprint Created: 14/Feb/23 Updated: 14/Feb/23 Resolved: 14/Feb/23 |
|
| Status: | Resolved |
| Project: | yangtools |
| Component/s: | parser |
| Affects Version/s: | None |
| Fix Version/s: | 8.0.10, 9.0.7, 10.0.4 |
| Type: | Improvement | Priority: | Medium |
| Reporter: | Robert Varga | Assignee: | Robert Varga |
| Resolution: | Done | Votes: | 0 |
| Labels: | pt | ||
| Remaining Estimate: | Not Specified | ||
| Time Spent: | Not Specified | ||
| Original Estimate: | Not Specified | ||
| Epic Link: | Parser Performance |
| Description |
|
The sizing of classes we use for tracking prerequisites leaves something to be desired: ***** Hotspot Layout Simulation (JDK 15, 32-bit model, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseFinished object internals: OFF SZ TYPE DESCRIPTION VALUE 0 4 (object header: mark) N/A 4 4 (object header: class) N/A 8 1 boolean AbstractPrerequisite.done N/A 9 3 (alignment/padding gap) 12 4 java.lang.Object AbstractPrerequisite.value N/A 16 4 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.this$0 N/A 20 4 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl PhaseFinished.this$0 N/A Instance size: 24 bytes Space losses: 3 bytes internal + 0 bytes external = 3 bytes total typically: ***** Hotspot Layout Simulation (JDK 15, 64-bit model, compressed references, compressed class pointers, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseFinished object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 4 (object header: class) N/A 12 1 boolean AbstractPrerequisite.done N/A 13 3 (alignment/padding gap) 16 4 java.lang.Object AbstractPrerequisite.value N/A 20 4 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.this$0 N/A 24 4 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl PhaseFinished.this$0 N/A 28 4 (object alignment gap) Instance size: 32 bytes Space losses: 3 bytes internal + 4 bytes external = 7 bytes total and also: ***** Hotspot Layout Simulation (JDK 15, 64-bit model, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseFinished object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 8 (object header: class) N/A 16 1 boolean AbstractPrerequisite.done N/A 17 7 (alignment/padding gap) 24 8 java.lang.Object AbstractPrerequisite.value N/A 32 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.this$0 N/A 40 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl PhaseFinished.this$0 N/A Instance size: 48 bytes Space losses: 7 bytes internal + 0 bytes external = 7 bytes total This gets even worse in other classes: ***** Hotspot Layout Simulation (JDK 15, 64-bit model, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseModificationInNamespacePath object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 8 (object header: class) N/A 16 1 boolean AbstractPrerequisite.done N/A 17 7 (alignment/padding gap) 24 8 java.lang.Object AbstractPrerequisite.value N/A 32 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.this$0 N/A 40 8 org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase AbstractPathPrerequisite.modPhase N/A 48 8 java.lang.Iterable AbstractPathPrerequisite.keys N/A 56 8 java.util.Iterator AbstractPathPrerequisite.it N/A 64 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPathPrerequisite.this$0 N/A 72 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl PhaseModificationInNamespacePath.this$0 N/A Instance size: 80 bytes Space losses: 7 bytes internal + 0 bytes external = 7 bytes total The problem is we are using or three fields to track the same outer object reference (".this$0"). Using an explicit field, passing it through constructors and making the classes static results in: ***** Hotspot Layout Simulation (JDK 15, 64-bit model, compressed references, compressed class pointers, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseFinished object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 4 (object header: class) N/A 12 1 boolean AbstractPrerequisite.done N/A 13 3 (alignment/padding gap) 16 4 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.modifier N/A 20 4 java.lang.Object AbstractPrerequisite.value N/A Instance size: 24 bytes Space losses: 3 bytes internal + 0 bytes external = 3 bytes total which the same size as 32bit, an improvement of 8 bytes/25%
***** Hotspot Layout Simulation (JDK 15, 64-bit model, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseFinished object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 8 (object header: class) N/A 16 1 boolean AbstractPrerequisite.done N/A 17 7 (alignment/padding gap) 24 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.modifier N/A 32 8 java.lang.Object AbstractPrerequisite.value N/A Instance size: 40 bytes Space losses: 7 bytes internal + 0 bytes external = 7 bytes total improvement of 8 bytes/16%
***** Hotspot Layout Simulation (JDK 15, 64-bit model, 8-byte aligned) org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl$PhaseModificationInNamespacePath object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) N/A 8 8 (object header: class) N/A 16 1 boolean AbstractPrerequisite.done N/A 17 7 (alignment/padding gap) 24 8 org.opendaylight.yangtools.yang.parser.stmt.reactor.ModifierImpl AbstractPrerequisite.modifier N/A 32 8 java.lang.Object AbstractPrerequisite.value N/A 40 8 org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase AbstractPathPrerequisite.modPhase N/A 48 8 java.lang.Iterable AbstractPathPrerequisite.keys N/A 56 8 java.util.Iterator AbstractPathPrerequisite.it N/A Instance size: 64 bytes Space losses: 7 bytes internal + 0 bytes external = 7 bytes total improvement of 16 bytes/20% |