Reference:
https://pangin.pro/posts/computation-in-static-initializer
https://cl4es.github.io/2019/02/21/Cljinit-Woes.html
HotSpot does not inline methods of uninitialized classes.
source code:
https://hg.openjdk.java.net/jdk-updates/jdk11u/file/cd1c042181e9/src/hotspot/share/opto/bytecodeInfo.cpp#l455
Access to a static field from a static method of uninitialized class may be an overwhelming obstacle for HotSpot compiler.
Work around:
Just don't do heavy computation in an uninitialized class directly. :-\
(From compiled language point of view, it's quite absurd and duh~duh~duh~)
If putting the computation logic in a helper class with no static initializer, it won’t suffer from performance penalty.
e.g
https://pangin.pro/posts/computation-in-static-initializer
https://cl4es.github.io/2019/02/21/Cljinit-Woes.html
HotSpot does not inline methods of uninitialized classes.
source code:
https://hg.openjdk.java.net/jdk-updates/jdk11u/file/cd1c042181e9/src/hotspot/share/opto/bytecodeInfo.cpp#l455
Access to a static field from a static method of uninitialized class may be an overwhelming obstacle for HotSpot compiler.
Work around:
Just don't do heavy computation in an uninitialized class directly. :-\
(From compiled language point of view, it's quite absurd and duh~duh~duh~)
If putting the computation logic in a helper class with no static initializer, it won’t suffer from performance penalty.
e.g
public class StaticExample {
static final long[] TABLE = Helper.prepareTable();
private static class Helper {
static long[] prepareTable() {
long[] table = new long[100_000_000];
for (int i = 1; i < table.length; i++) {
table[i] = nextValue(table[i - 1]);
}
return table;
}
static long nextValue(long seed) {
return seed * 0x123456789L + 11;
}
}
}
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.