我是Java 8的新手,对Lambda Expression的范围感到有点困惑.我读了一些文章表示Lambda Expression减少了执行时间,所以要找到我写的两个程序之后的相同内容
1)不使用Lambda Expression
import java.util.*;
public class testing_without_lambda
{
public static void main(String args[])
{
long startTime = System.currentTimeMillis();
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
for (int number : numbers)
{
System.out.println(number);
}
long stopTime = System.currentTimeMillis();
System.out.print("without lambda:");
System.out.println(stopTime - startTime);
}//end main
}
Run Code Online (Sandbox Code Playgroud)
输出:
2)使用Lambda Expression
import java.util.*;
public class testing_with_lambda
{
public static void main(String args[])
{
long startTime = System.currentTimeMillis();
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.forEach((Integer value) -> System.out.println(value));
long stopTime = System.currentTimeMillis();
System.out.print("with lambda:");
System.out.print(stopTime - startTime);
}//end main
}
Run Code Online (Sandbox Code Playgroud)
输出:
这是否意味着Lambda Expression需要更多时间来执行?
关于"执行时间"可能没有一般性陈述,因为即使术语"执行时间"并不总是意义相同.当然,没有理由,为什么只使用lambda表达式一般会减少执行时间.
你的代码是测量码的初始化时间和它的执行时间,这是公平的,当你考虑到小程序的总执行时间,但对于现实生活中的应用,它没有任何意义,因为它们通常运行显著比他们更长初始化时间.
使初始化时间产生巨大差异的原因是JRE在内部使用了Collection API本身,因此在应用程序启动之前,它的类被加载并初始化甚至可能在某种程度上进行优化(因此您不需要测量它费用).相反,它不使用lambda表达式,因此首次使用lambda表达式将在后台加载并初始化整个框架.
由于您通常对代码在实际应用程序中的执行方式感兴趣,在初始化已经发生的情况下,您必须在同一JVM中多次执行代码才能获得更好的图像.但是,允许JVM的优化器处理代码有可能由于其更简单的性质(与现实生活场景相比)而过度优化,并且显示过于乐观的数字.这就是为什么建议使用由专家开发的复杂基准测试工具,而不是创建自己的.即使使用这些工具,您也必须研究他们的文档以了解并避免陷阱.另请参阅如何在Java中编写正确的微基准测试?
当您比较for循环(也称为"外部迭代")与等效forEach调用(也称为"内部迭代")时,后者确实具有更高效的潜力,如果由特定集合正确实现,但其结果是很难预测,因为JVM的优化器擅长消除其他解决方案的缺点.此外,如果存在,您的列表太小,无法表现出这种差异.
还必须强调的是,这一原则对于lambda表达式并不严格.您还可以Consumer通过匿名内部类实现,在您的情况下,示例遇到第一次初始化成本时,匿名内部类将比lambda表达式更快.
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |