Я пытаюсь написать тесты jmh.
Я наткнулся на различные блоги, в которых упоминаются подводные камни в бенчмаркинге jmh. Типичным примером являются
- этот код
int sum() {
int a =7;
int b = 8;
return a+b;
}
будет оптимизирован для
int sum() {
return 15;
}
- этот код
int sum(int y) {
int x = new Object();
return y;
}
будет оптимизирован для
int sum(int y) {
return y;
}
то есть удаление неиспользуемой инициализации объекта.
Но этот список далеко не исчерпывающий, что может сделать jvm для оптимизации.
Ниже приведена проблема, с которой я столкнулся.
Допустим, есть несколько методов, и вот как выглядит граф вызовов
int methodA(CustomObjectA a) {
//do something
methodB(a);
//do something
return returnValueA;
}
int methodB(CustomObjectA a) {
//do something
methodC(a);
//do something
return returnValueB;
}
int methodC(CustomObjectA a) {
//do something
return returnValueC;
}
И мы попробуем протестировать метод А. Передавая CustomObjectA, созданный в объекте состояния. Но
с точки зрения JVM methodC всегда вызывается с одной и той же ссылкой, не будет ли он оптимизировать methodC для постоянного возврата одного и того же returnValueC?
Почему бы не сделать это?
Как мы можем убедиться, что эта оптимизация не будет выполнена? передавая разные ссылки каждый раз, используя @State(Scope.Thread)?
Есть ли какой-нибудь исчерпывающий список, чтобы объяснить, что вся оптимизация возможна?
int methodC(CustomObjectA a)
почему вы передаетеa
в качестве аргумента, если вы ничего с ним не делаете? - person Eugene   schedule 07.04.2021