Большая разница во времени между классом Java Lambda и Anonymous
Мне было интересно узнать производительность создания экземпляров лямбда-кода java8 для одного и того же анонимного класса. (Измерение выполнено на 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 раза.
Но действительно мало сдвига, чтобы сделатьзакрытие показывает очень плохое время для лямбды. Анонимный класс побеждает 10 раз! Теперь анонимный класс выглядит так:
ICallback clb = new ICallback() {
@Override
public void payload() {
arr[0]++;
}
};
И лямбда делает следующее:
ICallback clb = () -> {
arr[0]++;
};
(Полный код можно взять там:http://codepad.org/XYd9Umty Может кто-нибудь объяснить мне, почему существует такая большая (плохая) разница в обработке замыкания?