Java Lambda 与匿名类之间的执行时间差很大
我对针对同一匿名类创建java8 lambda实例的性能感到好奇(在win32 java build 1.8.0-ea-b106上执行测量)。我创建了非常简单的示例,并测量了java在创建lambda表达式时是否建议对运算符进行一些优化: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)结果相当可预测 - lambda 获胜 2 次。
但是,进行闭包的微小转变表明lambda的时机非常糟糕。匿名班级获胜10次!所以现在匿名类看起来像这样:
ICallback clb = new ICallback() {
@Override
public void payload() {
arr[0]++;
}
};
lambda的作用如下:
ICallback clb = () -> {
arr[0]++;
};
(完整的代码可以在那里采取:http://codepad.org/XYd9Umty)谁能解释一下为什么在处理闭合方面存在如此大(坏)的差异?