.NET 6 对 StackOverflow 的优化

.NET 6 对 StackOverflow 的优化

Intro

去年写了一系列的傻逼代码, 其中有一篇 写了多年代码,你会 StackOverflow 吗,昨天一不小心又写了一个 StackOverflow 代码。。然后想把新的代码加到原来 StackOverflow 的示例中,把原来的示例项目改成了 .NET 6 项目,偶然间发现 .NET 6 对于 StackOverlow 有一些小优化,且看下文

Sample

首先来看我们的 StackOverflow 的示例代码,最初的版本是没有 stack overflow 的,后来想着优化一下哎就改成了 StackOverflow 的版本了。。

下面示例中有两个参数,可以理解为方法参数,会是动态的参数,不是一成不变的

var isNegative = false;
var oper = '>';

第一个版本的代码是这样的:

Func<int, bool> filter;if (!isNegative)
{filter = oper == '>'? (i => i > 0): (i => i < 0);
}
else
{filter = oper == '>'? (i => i <= 0): (i => i >= 0);
}

大概意图是这样的,isNegative 是表示条件是否取反,truefalse 的反向操作,比如上面的代码,如果 isNegativefalsefilter 表示 >0,则 isNegativetrue , filter 表示为 <=0

第二次看这样的代码的时候,感觉是不是可以优化一下,如果 isNegativetrue 的时候取一个反,于是改成了下面这样

第二版:

filter = oper == '>'? (i => i < 0): (i => i > 0);
if (isNegative)
{filter = i => !filter(i);
}

这样看起来是不是简单一些,但就是这样的代码会导致 StackOverflow

上面的代码 filter = i => !filter(i); 等同于下面这样的代码:

Func<int, bool> filter = x => x>0;
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 Func<int, bool>(<>c.<>9.<Main>b__4_0));
<>c__DisplayClass4_.func = new Func<int, bool>(<>c__DisplayClass4_.<Main>b__1);private sealed class <>c
{public static readonly <>c <>9 = new <>c();public static Func<int, bool> <>9__4_0;internal bool <Main>b__4_0(int x){return x > 0;}
}private sealed class <>c__DisplayClass4_0
{public Func<int, bool> func;internal bool <Main>b__1(int x){return func(x);}
}

从上面的代码可以看出来,这里发生了一个死循环,<>c__DisplayClass4_0func 在调用的时候会调用 <Main>b__1 方法,而这个方法会再次调用 func 这个委托,之后互相调用起来最后就爆栈了...

那么上面的代码是不是可以优化呢,可能也谈不上优化,只是用了模式匹配换了一种写法罢了,第三版写法如下:

Func<int, bool> filter = (isNegative, oper) switch
{(false, '>') => i => i > 0,(false, _) => i => i < 0,(true, '>') => i => i <= 0,(true, _) => i => i >= 0,
};

这里使用了 switch 的模式匹配来简化代码,效果和第一种方式完全一样,只是换了一种写法

StackOverflow enhancement

我们拿前面第二种写法的一个最简化的代码来做一个测试,代码如下:

Func<int, bool> filter = x => x>0;
filter = delegate (int i) =>
{return filter(i);    
};
Console.WriteLine(filter(10));

首先把项目修改成 .netcoreapp3.1,然后运行这段代码,输出结果如下:

958d344e700e16fa381cf75329935b7b.png

只有一句 Stack overflow.

然后将项目改成 .net6.0 再运行,输出结果如下:

567e80f78246b3617680acc4600ff6a4.png

可以看到在 .NET 6 下,StackOverflow 的时候会打印出一个重复的次数以及调用的堆栈信息,这对于我们我们排查问题来说会非常的友好,可以让我们更快更准确的找到问题代码,减少焦虑的时间

More

在之前的版本中,如果发生了 StackOverflow 我们需要依赖 Dump 去分析调用堆栈,即使现在微软的文档中还有根据 dump 分析 StackOverflowException 的,这一优化可以帮助我们很好很高效的找到发生错误的代码

References

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/StupidSamples/StackOverflowSample.cs#L49

  • 写了多年代码,你会 StackOverflow 吗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【原】python中文文本挖掘资料集合

这些网址是我在学习python中文文本挖掘时觉得比较好的网站&#xff0c;记录一下&#xff0c;后期也会不定期添加&#xff1a;1.http://www.52nlp.cn/python-%E7%BD%91%E9%A1%B5%E7%88%AC%E8%99%AB-%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86-%E7%A7%91%E5%AD%A6%E8%AE%A1%E7%AE%97-…

Android之从网络上获取图片的两种方式讲解:thread+handle和AsyncTask方式

从网络上获取图片是一个比较耗时的操作,放在主线程会导致阻塞主线程,响应超时,所以我们不能把它放在主线程里操作,必须放在一个子线程里,我打算采用两种方式去实现。1、采用thread去获取图片,获取到后通过handle把消息发送到与主线程绑定的消息队列中(也就是主线程的loo…

freeware

http://www.nirsoft.net/utils/iconsext.html转载于:https://www.cnblogs.com/androidme/archive/2013/03/13/2957509.html

卸载wrapt_[python] 安装TensorFlow问题 解决Cannot uninstall 'wrapt'. It is a distutils installed project...

cmd安装 pip install tensorflow1.遇到了ERROR: Cannot uninstall wrapt. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.办法1&#xff1a;输入 pip install -U --ig…

推荐16款非常有创意的婚礼请贴

为什么80%的码农都做不了架构师&#xff1f;>>> 日期&#xff1a;2012-4-5 来源&#xff1a;GBin1.com 婚约是标志着你和你的伴侣很快就要有新的开始了&#xff0c;一起开始那段新的历程&#xff01;婚礼是整个人生旅途中的一个重要里程碑&#xff0c;在婚礼的邀请…

三年磨一剑,五次被拒稿,交大博士坚持稿件申诉,终发表学科顶刊

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;募格学术三年磨一剑&#xff0c;经历五轮审稿被拒&#xff0c;他坚持不懈&#xff0c;最终申诉成功发表物理顶刊&#xff1b;厚积薄发、精益求精&#xff0c;他潜心科研&#xff0c;2年内发表6篇高水平论文&#xff…

Android之面试题精选,自己收藏下

1.android dvm 的进程和Linux的进程&#xff0c;应用程序的进程是否为同一个概念&#xff1a; 答&#xff1a;dvm是dalivk虚拟机。每一个android应用程序都在自己的进程中运行&#xff0c;都拥有一个dalivk虚拟机实例。而每一个dvm都是在linux的一个进程。所以说可以认为是同一…

Java内部类详解(转)

说起内部类这个词&#xff0c;想必很多人都不陌生&#xff0c;但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多&#xff0c;用得最多的是在有事件监听的情况下&#xff0c;并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟。下面是本文的目录大纲&…

红旗河最早设计计算机的目的,论红旗河的利弊及其替代方案

最近网上有一条人工河很吸人眼球&#xff0c;它就是我国许多专家们提议的"藏水入疆"的西线调水工程——红旗河&#xff0c;其初衷是好的&#xff0c;想将丰沛的西藏雪化水及降水引入干旱的西北地区滋润出良田来改善中华民族的生存环境&#xff0c;但我认为该工程将是…

.NET Conf 2021 正在进行中,带你看一看微软带来了什么内容

今年最大的.NET活动正在进行, 可以通过Channel9 https://channel9.msdn.com/Events/dotnetConf/2021 看具体的Session 。微软和社区一直在努力统一.NET技术栈。从Visual Studio 到 SQL 和 Azure &#xff0c;所有功能聚集一堂&#xff0c;让您在桌面、网络、移动和跨平台开发梦…

2013-3-14 生活日记

下午 做java案例和算法设计 5:00—6:00 健身吃饭 6:30 回图书馆做数据挖掘作业 10&#xff1a;30回宿舍 转载于:https://www.cnblogs.com/sunrunzhi/archive/2013/03/14/2959421.html

C# js调用winform方法,C# JS与winform通信

关键组件&#xff1a;System.windows.Forms.WebBroswer 关键声明:类前声明 namespace gdi___ {[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name "FullTrust")][System.Runtime.InteropServices.ComVisibleAtt…

下班忘打卡了什么后果_工厂园区安装人脸识别门禁系统有什么好处?

通常情况下&#xff0c;工厂园区的人员流动都是比较频繁且巨大的。厂区的人员不断的进进出出&#xff0c;主要集中在上下班的时间段里面。对于工厂园区的管理人员来说&#xff0c;怎样管理好人员的进出安全与快捷高效通行&#xff0c;与此同时完成上下班的考勤尤其重要。当前的…

Android之matrix类控制图片的旋转、缩放、移动

在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为四个基本类型: 1、Translate————平移变换 2、Scale————缩放变换 3、Rotate————旋转变换 4、Skew————错切变换 在Android的API里对于每一种变换都提供了三种操作方式…

史上最难逻辑题!据说99.9%的人都做不出来……

全世界只有3.14 % 的人关注了爆炸吧知识非常「逻辑」撩人于无形普林斯顿大学博士生 Raymond Smullyan 是一位非常厉害逻辑高手。在Smullyan与他非常迷恋的女音乐家的第一次约会上&#xff0c;他用了一招意想不到“逻辑”方法&#xff0c;撩她于无形。他说道&#xff1a;“我们来…

中科大计算机博士毕业条件,中国科技大学博士和硕士研究生毕业要求.doc

中国科技大学博士和硕士研究生毕业要求中国科学技术大学研究生学习培养过程要求研究生院、校学位办2011年4月目 录 TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc291147553" 关于博士学位标准修订的指导原则 PAGEREF _Toc291147553 \h 1 HYPERLINK \l "_…

手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序

注意&#xff1a;文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个&#xff0c;推荐使用Windows Terminal运行命令行工具的时候建议以管理员身份&#xff0c;避免踩坑为了保证操作顺畅&#xff0c;建议使用PowerShell先执行一下set-ExecutionPolicy Remot…

[转]了解ASP.NET MVC几种ActionResult的本质:EmptyResult ContentResult

本文转自&#xff1a;http://www.cnblogs.com/artech/archive/2012/08/13/action-result-01.html 定义在Controller中的Action方法大都返回一个ActionResult对象。ActionResult是对Action执行结果的封装&#xff0c;用于最终对请求进行响应。ASP.NET MVC提供了一系列的ActionRe…

Android之Animation动画的介绍及用法

Android SDK介绍了2种Animation: Tween Animation(渐变动画):通过对特定的对象做图像变换如平移、缩放、旋转、淡出/淡入等产生动画效果 Frame Animation(帧动画):创建一个Drawable序列,这些Drawable可以按照指定的时间间隔一个一个的显示,也就是顺序播放事先做好的图像…

怎样判断ios app 第一次启动

我已经看到这个问题很多次了。今天抽空研究了一下 首次运行的应用程序加入一些help 或者 宣传动画 现在变的很重要了。 一个有用的例子是发送一个分析实例。这可能是一个很好的方法来确定有多少人下载实用应用程序。有人会说&#xff1a;“但是&#xff0c;嘿&#xff0c;苹果A…