我有一个漫长的过程,有两个主要阶段。第一阶段和第二阶段的执行路径略有不同。
我刚刚意识到,如果我创建具有不同名称的相同方法的副本并在每个阶段使用不同的名称,根据 JMH ( -server
, on java-7-openjdk-amd64
),我在第二阶段的方法调用中获得超过 25% 的加速(在 5 次调用预热后,对该方法的数百万次调用,以 5 次调用来衡量)。
有没有办法告诉 JVM 忘记以前对方法的优化并从头开始重新学习?
在下面的示例代码中,基准测试方法是,并且在调用和in 的run
两个版本之间进行比较。checkChar
checkChar0
stage2
final public void run(){
sumStg1=0;
for(int i=0; i< 10000; i++){
String str = consumeString();
for(int i= 0; i<K; i++){
sumStg1 += checkChar(str.charAt(i), i)?1:0;
}
}
sumStg2=0;
for(int j=0; j< 10000000; j++){
String str = consumeString();
for(int i=K/2; i<str.length(); i++){
sumStg2 += checkChar(str.charAt(i), i)?1:0;
}
}
}
final public boolean checkChar(char in, int i){
if(i < K/2){
...
} else if (i < K){
...
} else {
...
}
}
//identical method to checkChar
final public boolean checkChar0(char in, int i){
if(i < K/2){
...
} else if (i < K){
...
} else {
...
}
}