【发布时间】:2014-10-07 15:12:14
【问题描述】:
我做了一个程序来比较迭代速度和递归速度,操作非常简单。 我注意到一些我无法解释的奇怪现象。 根据处理的值的数量,迭代或递归的速度更快。但这并不一致。
- 大约 10 次,迭代速度更快。
- 大约 100 次,迭代速度更快。
- 对于大约 200,递归更快。
- 对于大约 1000,递归更快。
- 对于大约 5000,迭代更快。
- 对于大约 10000,迭代更快。
- 除此之外,递归运行到堆栈溢出,所以不能测试更高。
为什么迭代过程对于较低和较高的可测试量来说更快,但对于介于两者之间的量则不然?
我对此缺乏更深入的了解,如果有人可以向我解释这一点,我将不胜感激。
这里是那些想要自己测试的人的代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Compare_Recursive_Iterative
{
class Program
{
static void Main(string[] args)
{
// Amount of values processed.
long testNumber = 200;
// Variables to measure time taken.
double timeIterative, timeRecursive, timeTotal;
// Iterative process + time elapsed calculation
DateTime start = DateTime.Now;
long retVal = 0;
for(long i = 1; i <= testNumber; i++)
{
retVal = 0;
for (long x = 1; x <= i; x++)
{
retVal += x;
}
Console.WriteLine("For " + i + ": " + retVal);
}
TimeSpan timeDiff = DateTime.Now - start;
timeIterative = timeDiff.TotalMilliseconds;
// Recursive process + time elapsed calculation
DateTime start2 = DateTime.Now;
for (long i = 1; i <= testNumber; i++)
{
Console.WriteLine("For " + i + ": " + calculate(i));
}
timeDiff = DateTime.Now - start2;
timeRecursive = timeDiff.TotalMilliseconds;
// Results to console.
Console.WriteLine("Iterative: " + timeIterative + "ms /// Recursive: " + timeRecursive + "ms");
timeDiff = DateTime.Now - start;
timeTotal = timeDiff.TotalMilliseconds;
Console.WriteLine("Total time needed: " + timeTotal + "ms");
Console.WriteLine("Iterative - Recursive: " + (timeIterative - timeRecursive) + "ms");
Console.Read();
}
// Recursive method
static long calculate(long x)
{
if (x <= 1)
return x;
else
return x + calculate(x - 1);
}
}
}
【问题讨论】:
-
老实说这里的计算太少了,
DateTime.Now不是用于高精度测量的,结果主要是由于写入控制台需要多长时间。 -
虽然递归实现通常需要相对昂贵的调用指令,但选择递归或迭代的最显着原因是基于深度(由于潜在的堆栈溢出)和不是性能本身。
-
另请阅读Eric Lippert's series on writing benchmarks。编写它们时有一些常见的陷阱需要注意,在这个示例中可以找到一些。
标签: c# performance recursion iteration