我很好奇在同一个匿名类上创建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次。
但是对于closure来说,几乎没有什么变化,这对lambda来说是非常糟糕的。匿名类赢了10次!所以现在匿名类看起来像这样:
ICallback clb = new ICallback() {
@Override
public void payload() {
arr[0]++;
}
};
lambda的作用如下:
ICallback clb = () -> {
arr[0]++;
};
(完整代码可以从那里获取:http://codepad.org/XYd9Umty )有人能解释一下为什么在处理闭包方面存在如此大(糟糕)的差异吗?
https://stackoverflow.com/questions/19001241
复制相似问题