Memory layout benefits of inline classes

Sergey Kuksenko sergey.kuksenko at oracle.com
Wed May 6 17:50:42 UTC 2020


Hi,

I would suggest to look into this talk 
http://cr.openjdk.java.net/~skuksenko/valhalla/talk/vp.pdf

I hope some ideas/examples expressed there could be useful.

In general there are the following key areas where performance benefits 
of inline types arises:

- local variables in tight loops (eliminate allocations)

- dense memory layout

- GC write barriers elimination (the most undervalued point, but may 
give a huge impact)

- maybe something else....

Straightforward candidates are:

- All kinds of arithmetic/numeric types (Complex, java.lang.Number, 
vectors, ...)

- Short-lived intra-invocation objects. Like multy-value methods 
results/arguments, CompositeKey, Optional. Set of values wrapped with 
some united logic and splitting them gives performance, but extracting 
as separate class improve readability, maintenance.

- Dense data-structures. Currently we don't have direct candidates from 
JDK classlib. Searching to be continued. For example B-tree(or B+-tree) 
implementation should have benefits. Someday I'll implement a prototype 
to prove it.

- Cursor as replacement of Iterator

- to be continued.


On 4/27/20 12:44 AM, Swaranga Sarma wrote:
> The examples of the benefits of inline classes that I have seen in demos
> are things like high allocation of data classes in a tight loop. I was
> trying to understand how some of our existing code may benefit by using
> inline classes which is different from the examples seen. I have the
> following questions:
>
> 1. Optional: If we have a nullable members in a class, we would like to
> return an Optional<T> in the accessor for that member unless we have a
> reason to reduce the allocation. I recall somewhere that Optional might be
> an inline type in the future and this concern may no longer be valid. Is my
> understanding correct?
>
> 2. CompletableFuture: Similar to Optional, is this a candidate for
> potentially turning into an inline type?
>
> 3. Regular data classes: In a lot of our code bases, we have data classes
> that look like:
> class Identifier {
>    final @NonNull Name name;
>    final @NonNull Id id;
> }
>
> class Name {
>    final @NonNull String value;
> }
>
> class Id {
>    final @NonNull String value;
> }
>
> We create instances like these and pass these around to other methods.
> Those methods access the necessary values using the access methods like
> identifier.name().value() or identifier.id().value(). These classes are
> probably good candidates for migrating to records. But I was also
> interested to understand if we also made them inline classes what memory
> layout benefits would we get. Would the pointer de-referencing problem go
> away in such cases?
>
> To put it in another way, most of our data classes boil down to Strings,
> and assuming String will not become an inline type, would there be any
> memory-layout benefits of making such classes inline?
>
> Regards
> Swaranga


More information about the valhalla-dev mailing list