gpt4 book ai didi

c# - 上一个 CLR 中的尾调用优化

转载 作者:行者123 更新时间:2023-11-30 18:41:47 24 4
gpt4 key购买 nike

我发现(通过 accident )最后一个 CLR 执行尾调用优化。我已经用一段代码对其进行了测试,但坦率地说,它的行为并不符合我的预期。我认为当函数中的最后一件事是函数调用时,可能会发生尾调用优化。

我试图“破解”这段代码以防止表单尾部调用操作。

class Program
{
static void Foo(int counter, int limit)
{
try
{
if (counter == limit)
{
return;
}
Foo(++counter, limit);

int d = 1;
d = Bar(d);
//Console.Write(d);
//Thread.Sleep(1);
int baz = 0;
var z = baz + d;
StringBuilder b = new StringBuilder();
b.Append("D");
}
catch (Exception)
{
throw;
}
}

static int Sum(int s)
{
if (s == 1)
{
return s;
}
return s + Sum(s - 1);
}

static int Bar(int d)
{
return d = 10 + d;
}

static void Main(string[] args)
{
int i = 0;

Foo(i, 10000); // jitter
Sum(10000);

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Foo(i, 10000);
stopwatch.Stop();
Console.WriteLine(string.Format("time of execution = {0}ms",stopwatch.ElapsedMilliseconds));

stopwatch = new Stopwatch();
stopwatch.Start();
Sum(10000);
stopwatch.Stop();
Console.WriteLine(string.Format("time of execution = {0}ms", stopwatch.ElapsedMilliseconds));

Console.ReadKey();
}
}

但 Foo 仍然是优化的。怎么会?

最佳答案

在递归调用 Foo 之后,您没有做任何有副作用的事情。我假设您尝试了注释掉的代码并且它确实阻止了优化。那有什么问题呢?

您也可以写信给类成员,这将是无法丢弃的副作用。

private static int dummy;
static void Foo(int counter, int limit)
{
if (counter == limit) return;
Foo(++counter, limit);
dummy++;
}

然后阅读 Main 末尾的 dummy

关于c# - 上一个 CLR 中的尾调用优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6462118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com