素手烹茶|lambda表达式速度如何呢?看完这篇文章你就明白了( 二 )


public class LambdaTest {public static int N = 1_0000_0000;static List list = IntStream.range(0, N).boxed().collect(Collectors.toList());public static void main(String[] args) {long start, end;start = System.currentTimeMillis();lambdaTest();end = System.currentTimeMillis();System.out.println("lambda:" + (end - start));start = System.currentTimeMillis();loopTest();end = System.currentTimeMillis();System.out.println("loop:" + (end - start));}static void lambdaTest() {list.forEach(i -> {});}static void loopTest() {for (int i = 0; i < list.size(); i++) {}}}好了不卖关子了 , 直接说结论吧 。 上面测试方法的问题在于 , 两种测试方法实际上根本不对等 。 lambda表达式的测试中 , 虽然方法体是空的 , 但是程序执行的时候 , 仍然会取出每一个元素 , 然后再应用空的方法 。 而循环测试中 , 真的只是执行了一个空循环 , 什么也没干 。 因此这种方法测出来的结论 , 完全不能证明lambda表达式比空循环慢 。
公平的测试方法应该是怎么样的呢?对于循环 , 一样要加上取元素和应用空方法的操作 。 为此在空循环中增加了一部分代码 。 这样测出来的结果 , lambda表达式和普通循环一样都是150毫秒左右 , 存在几毫秒的误差 。 这次的结果可以反映真实情况了 , 那就是两者没有什么速度差别 。 大家可以自己运行代码试试 。
素手烹茶|lambda表达式速度如何呢?看完这篇文章你就明白了更加实际的测试【素手烹茶|lambda表达式速度如何呢?看完这篇文章你就明白了】不管怎么说 , 用空的方法来测试lambda表达式和普通循环并不具有实际意义 。 所以我换了一种更加实际的方法 , 来看看lambda相较于普通的循环有没有优势所在 。
首先准备一个用户类 , 这里用到了lombok自动生成各种工具方法 , 为我们节约时间 。
素手烹茶|lambda表达式速度如何呢?看完这篇文章你就明白了然后准备一个随机类 , 准备用来生成10万个随机用户 , 来进行下一步的操作 。
素手烹茶|lambda表达式速度如何呢?看完这篇文章你就明白了接下来就是测试代码了 。 测试代码其实也很简单 , 随机生成一千万个用户 , 然后进行简单的筛选操作 , 选出来所有ID大于1000且为偶数 , 用户名以字母a开头的用户 。 两种测试结果输出各自的筛选结果数量 , 以保证结果是相同的 。 因为这次的测试比较复杂 , 所以可以看出实际的差异 。 在我的电脑上 , lambda表达式耗时100毫秒左右 , 而循环耗时80毫秒左右 。 可见lambda表达式虽然比循环慢一点 , 但是差距很小 , 在千万次循环的级别仅差几十毫秒 , 对程序的运行基本没有什么影响 。
public class LambdaTest {public static int N = 1000_0000;static List list;public static void main(String[] args) {init();long start, end;start = System.currentTimeMillis();lambdaTest();end = System.currentTimeMillis();System.out.println("lambda:" + (end - start));start = System.currentTimeMillis();loopTest();end = System.currentTimeMillis();System.out.println("loop:" + (end - start));}static void init() {list = new ArrayList<>();for (int i = 0; i < N; i++) {list.add(new User(MyRandom.randomId(), MyRandom.randomUsername()));}}static void lambdaTest() {List


推荐阅读