Skip to content

Investigate inefficient object layouts #3135

Closed
@smarter

Description

@smarter

Using http://hg.openjdk.java.net/code-tools/jol/ we can inspect the layout of objects on the JVM, this is useful to see if there's anything we can optimize in our code, and to check how our object layout differs from what scalac generates:

$ wget http://central.maven.org/maven2/org/openjdk/jol/jol-cli/0.8/jol-cli-0.8-full.jar

As an example, here's the layout of InitialContext:

% java -jar jol-cli-0.8-full.jar internals -cp $HOME/.ivy2/cache/org.scala-sbt/interface/jars/interface-0.13.15.jar:$HOME/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.3.jar:interfaces/target/dotty-interfaces-0.4.0-bin-SNAPSHOT.jar:out/bootstrap/dotty-library-bootstrapped/scala-0.4/classes:out/bootstrap/dotty-compiler-bootstrapped/scala-0.4/classes 'dotty.tools.dotc.core.Contexts$InitialContext'
# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 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]

Failed to find matching constructor, falling back to class-only introspection.

dotty.tools.dotc.core.Contexts$InitialContext object internals:
 OFFSET  SIZE                                                   TYPE DESCRIPTION                               VALUE
      0    12                                                        (object header)                           N/A
     12     4                                                    int Context._period                           N/A
     16     8                                                   long Context.bitmap$0                          N/A
     24     8                                                   long Context.companionMethodFlags              N/A
     32     4                                                    int Context._mode                             N/A
     36     4                                                    int Context.findMemberCount                   N/A
     40     4             dotty.tools.dotc.core.TypeOps.deskolemize$ Context.deskolemize$lzy1                  N/A
     44     4                 dotty.tools.dotc.core.Contexts.Context Context._outer                            N/A
     48     4           dotty.tools.dotc.interfaces.CompilerCallback Context._compilerCallback                 N/A
     52     4                                 xsbti.AnalysisCallback Context._sbtCallback                      N/A
     56     4                       dotty.tools.dotc.core.TyperState Context._typerState                       N/A
     60     4                                        scala.Function1 Context._printerFn                        N/A
     64     4                   dotty.tools.dotc.core.Symbols.Symbol Context._owner                            N/A
     68     4         dotty.tools.dotc.config.Settings.SettingsState Context._sstate                           N/A
     72     4                       dotty.tools.dotc.CompilationUnit Context._compilationUnit                  N/A
     76     4                        dotty.tools.dotc.ast.Trees.Tree Context._tree                             N/A
     80     4                     dotty.tools.dotc.core.Scopes.Scope Context._scope                            N/A
     84     4                    dotty.tools.dotc.typer.TypeAssigner Context._typeAssigner                     N/A
     88     4                      dotty.tools.dotc.typer.ImportInfo Context._importInfo                       N/A
     92     4                 dotty.tools.dotc.core.Contexts.RunInfo Context._runInfo                          N/A
     96     4                                           scala.Option Context._diagnostics                      N/A
    100     4                 dotty.tools.dotc.core.Contexts.GADTMap Context._gadt                             N/A
    104     4                 dotty.tools.dotc.util.FreshNameCreator Context._freshNames                       N/A
    108     4                         scala.collection.immutable.Map Context._moreProperties                   N/A
    112     4                     dotty.tools.dotc.core.TypeComparer Context._typeComparer                     N/A
    116     4                        scala.collection.immutable.List Context.pendingMemberSearches             N/A
    120     4   dotty.tools.dotc.typer.Implicits.ContextualImplicits Context.implicitsCache                    N/A
    124     4                   dotty.tools.dotc.typer.SearchHistory Context._searchHistory                    N/A
    128     4                 dotty.tools.dotc.core.Contexts.Context Context.phasedCtx                         N/A
    132     4               dotty.tools.dotc.core.Contexts.Context[] Context.phasedCtxs                        N/A
    136     4                          java.lang.StackTraceElement[] Context.creationTrace                     N/A
    140     4             dotty.tools.dotc.core.Contexts.ContextBase InitialContext.base                       N/A
Instance size: 144 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

deskolemize probably doesn't need to be a field in every Context. It's especially costly because it's defined as an object and thus translated to a lazy val (which requires an extra field bitmap$0 in the dotty encoding compared to scalac). I just made a PR for this: #3136

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions