查看网站历史页面,wordpress seo怎么做,网页设计与制作论文1000字,网站页面排版.NET 6 对 StackOverflow 的优化Intro去年写了一系列的傻逼代码, 其中有一篇 写了多年代码#xff0c;你会 StackOverflow 吗#xff0c;昨天一不小心又写了一个 StackOverflow 代码。。然后想把新的代码加到原来 StackOverflow 的示例中#xff0c;把原来的示例项目改成了 … .NET 6 对 StackOverflow 的优化Intro去年写了一系列的傻逼代码, 其中有一篇 写了多年代码你会 StackOverflow 吗昨天一不小心又写了一个 StackOverflow 代码。。然后想把新的代码加到原来 StackOverflow 的示例中把原来的示例项目改成了 .NET 6 项目偶然间发现 .NET 6 对于 StackOverlow 有一些小优化且看下文Sample首先来看我们的 StackOverflow 的示例代码最初的版本是没有 stack overflow 的后来想着优化一下哎就改成了 StackOverflow 的版本了。。下面示例中有两个参数可以理解为方法参数会是动态的参数不是一成不变的var isNegative false;
var oper ;第一个版本的代码是这样的Funcint, bool filter;if (!isNegative)
{filter oper ? (i i 0): (i i 0);
}
else
{filter oper ? (i i 0): (i i 0);
}大概意图是这样的isNegative 是表示条件是否取反true 是 false 的反向操作比如上面的代码如果 isNegative 为 falsefilter 表示 0则 isNegative 为 true , filter 表示为 0第二次看这样的代码的时候感觉是不是可以优化一下如果 isNegative 为 true 的时候取一个反于是改成了下面这样第二版filter oper ? (i i 0): (i i 0);
if (isNegative)
{filter i !filter(i);
}这样看起来是不是简单一些但就是这样的代码会导致 StackOverflow上面的代码 filter i !filter(i); 等同于下面这样的代码Funcint, bool filter x x0;
filter delegate (int i)
{return filter(i);
};如果觉得没有什么问题我们可以再往下看将上面的代码使用 ILSpy 使用 C# 1.0 翻译一下可以看到翻译后的结果如下c__DisplayClass4_0 c__DisplayClass4_ new c__DisplayClass4_0();
c__DisplayClass4_.func c.9__4_0 ?? (c.9__4_0 new Funcint, bool(c.9.Mainb__4_0));
c__DisplayClass4_.func new Funcint, bool(c__DisplayClass4_.Mainb__1);private sealed class c
{public static readonly c 9 new c();public static Funcint, bool 9__4_0;internal bool Mainb__4_0(int x){return x 0;}
}private sealed class c__DisplayClass4_0
{public Funcint, bool func;internal bool Mainb__1(int x){return func(x);}
}从上面的代码可以看出来这里发生了一个死循环c__DisplayClass4_0 的 func 在调用的时候会调用 Mainb__1 方法而这个方法会再次调用 func 这个委托之后互相调用起来最后就爆栈了...那么上面的代码是不是可以优化呢可能也谈不上优化只是用了模式匹配换了一种写法罢了第三版写法如下Funcint, bool filter (isNegative, oper) switch
{(false, ) i i 0,(false, _) i i 0,(true, ) i i 0,(true, _) i i 0,
};这里使用了 switch 的模式匹配来简化代码效果和第一种方式完全一样只是换了一种写法StackOverflow enhancement我们拿前面第二种写法的一个最简化的代码来做一个测试代码如下Funcint, bool filter x x0;
filter delegate (int i)
{return filter(i);
};
Console.WriteLine(filter(10));首先把项目修改成 .netcoreapp3.1然后运行这段代码输出结果如下只有一句 Stack overflow.然后将项目改成 .net6.0 再运行输出结果如下可以看到在 .NET 6 下StackOverflow 的时候会打印出一个重复的次数以及调用的堆栈信息这对于我们我们排查问题来说会非常的友好可以让我们更快更准确的找到问题代码减少焦虑的时间More在之前的版本中如果发生了 StackOverflow 我们需要依赖 Dump 去分析调用堆栈即使现在微软的文档中还有根据 dump 分析 StackOverflowException 的这一优化可以帮助我们很好很高效的找到发生错误的代码Referenceshttps://github.com/WeihanLi/SamplesInPractice/blob/master/StupidSamples/StackOverflowSample.cs#L49写了多年代码你会 StackOverflow 吗