参见英文答案 >
How do I write a correct micro-benchmark in Java? 11个
我有两种我正在测试的Fibonacci方法.两者都应该是线性的.我不明白memoization或HashMap查找比我想象的要慢.
我有两种我正在测试的Fibonacci方法.两者都应该是线性的.我不明白memoization或HashMap查找比我想象的要慢.
我知道递归函数不应该通过添加DP来加速,但是因为它是静态的,所以它只需要计算一次(永远不会超出范围).第一次执行后,它从HashMap中检索答案.
我这样做是为了准备实现O(log n)斐波那契函数和基准测试,但是当我看到这个时,我会略微绕道而行. (即使对迭代方法添加memoization也会减慢它的速度).
请赐教,我此刻感觉很傻.
迭代方法:
public static int linearIterativeFib(int x) { if (x <= 2) { return 1; } else { int prev = 0; int result = 1; for (int i = 2; i <= x; i++) { int temp = result; result += prev; prev = temp; } return result; } }
递归方法:
static Map<Integer,Integer> memo = new HashMap<Integer,Integer>(); public static int linearRecursiveFib(int x) { if (x <= 2) { return 1; } else if (memo.containsKey(x)) { return memo.get(x); } else { int result = linearRecursiveFib(x - 1) + linearRecursiveFib(x - 2); memo.put(x,result); return result; } }
并进行单元测试:
@Test public void testSpeed() { int input = 35; long start = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { fib.linearIterativeFib(input); } System.out.println("Iterative approach took " + (System.currentTimeMillis() - start) + "ms"); start = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { fib.linearRecursiveFib(input); } System.out.println("Recursive approach took " + (System.currentTimeMillis() - start) + "ms"); }
返回:
Iterative approach took 6ms Recursive approach took 132ms
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。