我很好奇针对同一个匿名类创建 java8 lambda 实例的性能。(在 win32 java build 1.8.0-ea-b106 上进行测量)。我创建了非常简单的示例并测量了 javanew
在创建 lambda 表达式时是否建议对运算符进行一些优化:
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 )结果是相当可预测的 - lambda 赢了 2 次。
但是对于 lambda 来说,关闭的时间很少。匿名班赢了10次!所以现在匿名类看起来像:
ICallback clb = new ICallback() {
@Override
public void payload() {
arr[0]++;
}
};
和 lambda 做如下:
ICallback clb = () -> {
arr[0]++;
};
(完整的代码可以在那里获取:http ://codepad.org/XYd9Umty )有人可以解释一下为什么在处理关闭方面存在如此大(坏)的差异吗?