我正在尝试优化我拥有的代码。为了做到这一点,我编写了这段代码,以查看递归与迭代的效果。该代码“计数”到十分之一的幂。

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-函数周围发生的其他事情的开销高于函数执行所花费的时间。

09-08 02:54