我正在尝试优化我拥有的代码。为了做到这一点,我编写了这段代码来查看递归与迭代的效果。该代码“计数”到 10 的 n 次方。
public Form1()
{
InitializeComponent();
Stopwatch sw = new Stopwatch();
sw.Start();
recurse(4);
//iterate(4);
sw.Stop();
Text = sw.Elapsed.TotalMilliseconds.ToString();
}
void recurse(int i)
{
if (i < 1) return;
for (int x = 0; x < 10; x++) recurse(i - 1);
}
void iterate(int i)
{
i = (int)System.Math.Pow(10, i);
for (int x = 0; x < i; x++) ;
}
我得到了这个意想不到的结果:当 n 为 1 到 4 时,递归和迭代的速度约为 0.5 毫秒。 -而不是 4 比 1 慢 1000 倍,这是我所期望的。只有对于更大的数字,它才开始具有更直观的速度,迭代也比递归更快。
为什么10次和10000次速度一样?
即使您确实更正了代码以在两种情况下计算相同的结果,也不要在一次运行中测试类似的结果。除非测试本身至少需要一秒钟,否则您不会得到正确的结果。运行一百万次,然后除以总时间。当您测试只需要一两毫秒的内容时,您应该确保测试需要足够长的时间来忽略冷缓存、.Start() 和 .Stop() 调用次数、小 GC 延迟的差异与此同时,等等。还要确保实际工作比空计数循环花费更多时间(即for(many times) recurse(x)
有足够高的x
认为for
本身并不相关)
单次运行 0.5 毫秒的结果在这里或多或少没有意义。另外,如果它是一种即时语言,我建议在测试之前调用相同的函数,以确保它已经编译 - 否则会增加开销。
TL;DR - 函数周围发生的其他事情的开销高于函数执行所需的时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)