[YANGTOOLS-1375] Implement TypedefNamespace as a linear search Created: 03/Dec/21  Updated: 07/Dec/21  Resolved: 07/Dec/21

Status: Resolved
Project: yangtools
Component/s: model-spi
Affects Version/s: None
Fix Version/s: 8.0.0

Type: Improvement Priority: Medium
Reporter: Robert Varga Assignee: Robert Varga
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Issue split
split from YANGTOOLS-1316 Re-examine argument storage in effect... Resolved
Epic Link: Parser Performance

 Description   

We are currently indexing namespaces as part of constructors, which is reducing our flexibility in implementation class design. For example, ContainerEffectiveStatementImpl looks like this:

 

# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 0x0000000800000000 base address and 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

***** 32-bit VM: **********************************************************
org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ContainerEffectiveStatementImpl object internals:
 OFFSET  SIZE                                                               TYPE DESCRIPTION                                VALUE
      0     8                                                                    (object header)                            N/A
      8     4                             com.google.common.collect.ImmutableMap DefaultWithDataTree.schemaTree             N/A
     12     4                             com.google.common.collect.ImmutableMap DefaultWithDataTree.dataTree               N/A
     16     4                                                   java.lang.Object DefaultWithDataTree.substatements          N/A
     20     4   org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement DefaultWithDataTree.declared               N/A
     24     4                             com.google.common.collect.ImmutableMap WithTypedefNamespace.typedefNamespace      N/A
     28     4                                                                int ContainerEffectiveStatementImpl.flags      N/A
     32     4                       org.opendaylight.yangtools.yang.common.QName ContainerEffectiveStatementImpl.argument   N/A
     36     4      org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode ContainerEffectiveStatementImpl.original   N/A
Instance size: 40 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

***** 64-bit VM: **********************************************************
org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ContainerEffectiveStatementImpl object internals:
 OFFSET  SIZE                                                               TYPE DESCRIPTION                                VALUE
      0    16                                                                    (object header)                            N/A
     16     8                             com.google.common.collect.ImmutableMap DefaultWithDataTree.schemaTree             N/A
     24     8                             com.google.common.collect.ImmutableMap DefaultWithDataTree.dataTree               N/A
     32     8                                                   java.lang.Object DefaultWithDataTree.substatements          N/A
     40     8   org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement DefaultWithDataTree.declared               N/A
     48     8                             com.google.common.collect.ImmutableMap WithTypedefNamespace.typedefNamespace      N/A
     56     4                                                                int ContainerEffectiveStatementImpl.flags      N/A
     60     4                                                                    (alignment/padding gap)                    
     64     8                       org.opendaylight.yangtools.yang.common.QName ContainerEffectiveStatementImpl.argument   N/A
     72     8      org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode ContainerEffectiveStatementImpl.original   N/A
Instance size: 80 bytes
Space losses: 4 bytes internal + 0 bytes external = 4 bytes total

***** 64-bit VM, compressed references enabled: ***************************
org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ContainerEffectiveStatementImpl object internals:
 OFFSET  SIZE                                                               TYPE DESCRIPTION                                VALUE
      0    12                                                                    (object header)                            N/A
     12     4                             com.google.common.collect.ImmutableMap DefaultWithDataTree.schemaTree             N/A
     16     4                             com.google.common.collect.ImmutableMap DefaultWithDataTree.dataTree               N/A
     20     4                                                   java.lang.Object DefaultWithDataTree.substatements          N/A
     24     4   org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement DefaultWithDataTree.declared               N/A
     28     4                             com.google.common.collect.ImmutableMap WithTypedefNamespace.typedefNamespace      N/A
     32     4                                                                int ContainerEffectiveStatementImpl.flags      N/A
     36     4                       org.opendaylight.yangtools.yang.common.QName ContainerEffectiveStatementImpl.argument   N/A
     40     4      org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode ContainerEffectiveStatementImpl.original   N/A
     44     4                                                                    (loss due to the next object alignment)
Instance size: 48 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

***** 64-bit VM, compressed references enabled, 16-byte align: ************
org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ContainerEffectiveStatementImpl object internals:
 OFFSET  SIZE                                                               TYPE DESCRIPTION                                VALUE
      0    12                                                                    (object header)                            N/A
     12     4                             com.google.common.collect.ImmutableMap DefaultWithDataTree.schemaTree             N/A
     16     4                             com.google.common.collect.ImmutableMap DefaultWithDataTree.dataTree               N/A
     20     4                                                   java.lang.Object DefaultWithDataTree.substatements          N/A
     24     4   org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement DefaultWithDataTree.declared               N/A
     28     4                             com.google.common.collect.ImmutableMap WithTypedefNamespace.typedefNamespace      N/A
     32     4                                                                int ContainerEffectiveStatementImpl.flags      N/A
     36     4                       org.opendaylight.yangtools.yang.common.QName ContainerEffectiveStatementImpl.argument   N/A
     40     4      org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode ContainerEffectiveStatementImpl.original   N/A
     44     4                                                                    (loss due to the next object alignment)
Instance size: 48 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

Here typedefNamespace is usually empty and we do not really use the namespace – it is a relatively new addition for object model completeness.

Eliminate the field, saving us 8 bytes in the usual cases – worth at least 517KiB in the Junos model case.

 



 Comments   
Comment by Robert Varga [ 03/Dec/21 ]

Another option is to implement typedefNamespaceas a filter over substatements. This will eliminate the map, but make lookups O(N) instead of O(1), with N being the number of substatements.

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