[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%


Generated at Wed Feb 07 20:56:17 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.