Java函数式折叠,循环,记忆化效率初识

本文通过Junit4测试对比了三种计算方法在Java中的性能:左折叠、循环调用及记忆化处理。测试结果表明,记忆化处理速度最快,而折叠方法相比循环调用慢约20倍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java函数式折叠,循环,记忆化效率初识


最近在啃函数式编程思想,真的,感觉这本书让我受益匪浅,而且很有可能,这本书锁涵盖的知识会成为我实现梦想的必不可少的基石之一。

在Java中实现函数式编程的一个很重要的思想是函数的折叠。其应用之一就是如何解决大规模递归造成的StackOverFlow问题,实现思路是通过尾递归的方式将基于栈的递归调用转换为基于堆的递归调用。

这几个概念性的问题自己去查,我这里不会去特地说明,写这篇博客的主要目的仅仅是给自己做一个备忘录,帮助他人仅仅是次级的目的。打我呀~

以下是基于Junit4的简单测试,目的通过三种方式计算一亿次1~10的和。计算方式分别为:
* 左折叠
* 循环调用
* 记忆化处理

@Test
public void testLengthSpeed() {

    List<Integer> list = List.list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

    long begin = System.currentTimeMillis(), end;
    for (int j = 0; j < 100000000; j++)
        list.foldLeft(0, sum -> i -> sum + i);
    end = System.currentTimeMillis();
    System.out.println(end - begin);

    begin = System.currentTimeMillis();
    for (int j = 0; j < 100000000; j++)
        list.length();
    end = System.currentTimeMillis();
    System.out.println(end - begin);

    begin = System.currentTimeMillis();
    for (int j = 0; j < 100000000; j++)
        list.lengthMemorized();
    end = System.currentTimeMillis();
    System.out.println(end - begin);
}

然后以下是测试结果:

15878
845
5

Process finished with exit code 0

由此可知以下结论:
1. 同样 的计算过程,折叠比循环要慢20倍左右
2. 基于记忆化的调用如预期为常量级的调用时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值