我正在尝试优化我拥有的代码。为了做到这一点,我编写了这段代码,以查看递归与迭代的效果。该代码“计数”到十分之一的幂。
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 ms。 -而不是4比1慢1000倍,这是我所期望的。仅对于更大的数字,它才开始具有更直观的速度,迭代也比递归快。
为什么相同的速度是10倍还是10,000倍?
最佳答案
即使您确实纠正了两种情况下计算相同事物的代码,也不要一次测试类似的事物。除非测试本身花费至少一秒钟,否则您将无法获得正确的结果。运行一百万次,然后除以总时间。在测试仅需一毫秒或两毫秒的内容时,应确保测试花费的时间足以忽略冷缓存的差异,.Start()和.Stop()调用的时间,较小的GC延迟。同时,还应确保实际工作比空计数循环花费更多的时间(即for(many times) recurse(x)
具有足够高的x
以致for
本身不相关)
您一次运行0.5ms的结果在这里或多或少毫无意义。另外,如果这是一种固定的语言,我建议在测试之前调用相同的函数,以确保它已经被编译-否则会增加开销。
TL; DR-函数周围发生的其他事情的开销高于函数执行所花费的时间。