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. 基于记忆化的调用如预期为常量级的调用时间