Я пытаюсь снизить затраты на производительность и сборку мусора при ведении журналов.Я хочу иметь много операторов регистрации, которые я мог бы включить для отладки, но у меня также есть способ отключить их для быстрого производства.
Я выполнил тестирование при вызове следующих методов:
public static final isLogging = false;
public static logObjs(Object[] params) {
if(isLogging)
System.out.println(params[0]);
}
public static log3Obj(Object a, Object b, Object c) {
if(isLogging)
System.out.println(a);
}
public static logInts(int a, int b, int c) {
if(isLogging)
System.out.println(a);
}
Я сравнил функции с методом драйвера
long sum = 0;
for(int i = 0; i < 100000000; ++i) {
int a = i; int b = i+1; int c = i+2;
logFoo(a,b,c);
sum += a; }
logObjs (i, i + 1, i + 2) занимает около 2 секунд для 1e8 итераций и производит много мусора.Источниками, как я полагаю, являются автобокс целых чисел и создание Object [] для переменной # параметров.
log3Obj производит много (хотя и меньше) мусора и занимает около 1,2 секунды;опять же, я предполагаю, что автобокс все еще происходит.
logInts очень быстр (0,2 с), так же быстро, как цикл без вызова функции.
Итак, проблема в том, что хотя функция детерминистически ничего не делает,Автобокс все еще происходит.В моем коде я бы предпочел, чтобы isLogging не был окончательным, а скорее, чтобы это был параметр времени выполнения, но для этого это более простой случай (когда компилятор может доказать, что функция ничего не делает)должен бежать.Конечно, я могу заменить все свои записи в журнале на
if(isLogging)
logObjs(a, b, c);
, но это очень не элегантно.Я думал, что это то, что JIT должен заботиться.Я пробовал кучу настроек компилятора, но, может быть, что-то мне не хватает?Как сделать так, чтобы код не генерировал столько мусора, ничего не делая?