.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,一经查实,立即删除!

相关文章

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

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

推荐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…

Java内部类详解(转)

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

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

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

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;与此同时完成上下班的考勤尤其重要。当前的…

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

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

手把手教你学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…

华为nova6计算机在哪,华为nova6开发者选项在哪

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。打开华为nova6开发者选项的步骤是&#xff1a;1、首先进入手机桌面&#xff0c;点击设置。2、点击关于手机。3、连续点击版本号7次&#xff0c;输入锁屏密码&#xff0c;点击返回。4…

他是发明声呐的物理天才,被妻子家暴后出轨守寡的师母,爱因斯坦却公开支持.........

全世界只有3.14 % 的人关注了爆炸吧知识情不知所起一往而深1911年11月4日&#xff0c;巴黎新闻报的头版头条标题是《爱情故事&#xff1a;居里夫人与朗之万教授》。报纸一出&#xff0c;顷刻售罄&#xff1b;巴黎上下&#xff0c;满城“风流”。#寡妇科学家“乱伦”相差半旬已婚…

如何在 .NET Core 中获取 CPU 使用率

这篇文章我们分享一种如何在 .NETCore 中获取 CPU使用率的方法, 它所报告的这个值和 任务管理器 中报告的 CPU 使用值 差不多是一致的。在 .NET Framework 中&#xff0c;很多人会用 PerformanceCounter 类做这件事情&#xff0c;参考如下代码&#xff1a;public class Program…

uml 类图聚合与组合

聚合 聚合是关联关系的一种特例&#xff0c;他体现的是整体与部分、拥有的关系&#xff0c;即has-a的关系&#xff0c;此时整体与部分之间是可分离的&#xff0c;他们可以具有各自的生命周期&#xff0c;部分可以属于多个整体对象&#xff0c;也可以为多个整体对象共享&#xf…

Android之ViewPager使用(用美女做的背景,给你疲惫的眼睛视觉冲击)

ViewPager的使用 我们先爆照,来点视觉冲击,其它的ViewPager弱爆了 照片看完了,接来下我们就来实现,just do it 第一步 你的项目需要有android-support-v4.jar的包,你懂的,有了才会支持ViewPager 第二步 看下项目的结构图片

深入探讨用位掩码代替分支(8):SSE指令集速度测试

在上一篇测试了MMX指令集&#xff0c;这次我们来测试SSE指令集。说的更精确一点&#xff0c;是测试SSE2指令集。  本篇致力于解决以下问题——1.SSE/SSE2指令集是什么&#xff1f;2.如何阅读Intel/AMD的手册&#xff1f;3.如何运用SSE指令集&#xff1f;如何将MMX代码升级为S…

mysql字段简索引_MySQL优化看这一篇就够了

本文概要概述为什么要优化系统的吞吐量瓶颈往往出现在数据库的访问速度上随着应用程序的运行&#xff0c;数据库的中的数据会越来越多&#xff0c;处理时间会相应变慢数据是存放在磁盘上的&#xff0c;读写速度无法和内存相比如何优化设计数据库时&#xff1a;数据库表、字段的…

.NET 6 Talk Party 2|.NET Core 与行业

关注我们微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0c;将每周三到周六&#xff0c;组织 3~5 场线上分享活动。欢迎跟着…

施一公:中国还缺乏真正的世界顶尖大学,研究生该听听这些建议

全世界只有3.14 % 的人关注了爆炸吧知识“中国的科技发展很快&#xff0c;变得很大&#xff0c;但还不够强&#xff1b;中国的人才众多&#xff0c;变得很大&#xff0c;但还不够强。中国是一个高等教育大国&#xff0c;但从权威的世界大学排名来看&#xff0c;中国缺乏真正的世…

Android之Fragment 真正的完全解析(上)

转载出处&#xff1a;http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现&#xff0c;曾经有段时间&#xff0c;感觉大家谈什么都能跟Fragment谈上关系&#xff0c;做什么都要问下Fragment能实现不~~~哈哈&#xff0c;是不是有点过~~~ 本篇博客力求…