Optimising Java objects for CPU cache line efficiency

后端 未结 2 2013
清酒与你
清酒与你 2021-02-07 12:48

I\'m writing a library where:

  • It will need to run on a wide range of different platforms / Java implementations (the common case is likely to be O
相关标签:
2条回答
  • 2021-02-07 12:52

    You may require information about the various caches of your CPU, you can access it from Java using Cachesize (currently supporting Intel CPUs). This can help to develop cache-aware algorithms.

    Disclaimer : author of the lib.

    0 讨论(0)
  • 2021-02-07 12:53

    A first step towards cache line efficiency is to provide for referential locality (i.e. keeping your data close to each other). This is hard to do in JAVA where almost everything is system allocated and accessed by reference.

    To avoid references, the following might be obvious:

    1. have non-reference types (i.e. int, char, etc.) as fields in your objects
    2. keep your objects in arrays
    3. keep your objects small

    These rules will at least ensure some referential locality when working on a single object and when traversing the object references in your object graph.

    Another approach might be to not use object for your data at all, but have global non-ref typed arrays (of same size) for each item that would normally be a field in your class and then each instance would be identified by a common index into these arrays.

    Then for optimizing the size of the arrays or chunks thereof, you have to know the MMU characteristics (page/cache size, number of cache lines, etc). I don't know if JAVA provides this in the System or Runtime classes, but you could pass this information as system properties on start up.

    Of course this is totally orthogonal to what you should normally be doing in JAVA :)

    Best regards

    0 讨论(0)
提交回复
热议问题