Мне было интересно узнать о производительности создания экземпляров java8 lambda против одного и того же анонимного класса. (Измерение выполняется на win32 java build 1.8.0-ea-b106). Я создал очень простой пример и измерил, если java предложит некоторую оптимизацию оператора new
при создании выражения лямбда:
static final int MEASURES = 1000000;
static interface ICallback{
void payload(int[] a);
}
/**
* force creation of anonymous class many times
*/
static void measureAnonymousClass(){
final int arr[] = {0};
for(int i = 0; i < MEASURES; ++i){
ICallback clb = new ICallback() {
@Override
public void payload(int[] a) {
a[0]++;
}
};
clb.payload(arr);
}
}
/**
* force creation of lambda many times
*/
static void measureLambda(){
final int arr[] = {0};
for(int i = 0; i < MEASURES; ++i){
ICallback clb = (a2) -> {
a2[0]++;
};
clb.payload(arr);
}
}
(Полный код можно сделать там: http://codepad.org/Iw0mkXhD). Результат довольно предсказуем - лямбда выигрывает 2 раза.
Но на самом деле малое изменение сделать closure показывает очень плохое время для лямбда. Анонимный класс выигрывает 10 раз! Итак, теперь анонимный класс выглядит следующим образом:
ICallback clb = new ICallback() {
@Override
public void payload() {
arr[0]++;
}
};
И лямбда делает следующее:
ICallback clb = () -> {
arr[0]++;
};
(Полный код можно сделать там: http://codepad.org/XYd9Umty) Может ли кто-нибудь объяснить мне, почему существует такая большая (плохая) разница в обращении с закрытием?