当前位置:首页 > 科技  > 软件

面向接口编程,你考虑过性能吗?

来源: 责编: 时间:2023-10-06 19:20:32 407观看
导读大家在平时开发中大多都会遵循接口编程,这样就可以方便实现依赖注入也方便实现多态等各种小技巧,但这种是以牺牲性能为代价换取代码的灵活性,万物皆有阴阳,看你的应用场景进行取舍。一:背景1. 缘由在项目的性能改造中,发现

大家在平时开发中大多都会遵循接口编程,这样就可以方便实现依赖注入也方便实现多态等各种小技巧,但这种是以牺牲性能为代价换取代码的灵活性,万物皆有阴阳,看你的应用场景进行取舍。x2E28资讯网——每日最新资讯28at.com

一:背景

1. 缘由

在项目的性能改造中,发现很多方法签名的返回值都是采用IEnumerable接口,比如下面这段代码:x2E28资讯网——每日最新资讯28at.com

public static void Main(string[] args)        {            var list = GetHasEmailCustomerIDList();            foreach (var item in list){}             Console.ReadLine();        }        public static IEnumerable<int> GetHasEmailCustomerIDList()        {            return Enumerable.Range(1, 5000000).ToArray();        }

2. 有什么问题

这段代码乍一看也没啥什么性能问题,foreach迭代天经地义,这个还能怎么优化???x2E28资讯网——每日最新资讯28at.com

<1> 从MSIL中寻找问题

首先我们尽可能把原貌还原出来,简化后的MSIL如下。x2E28资讯网——每日最新资讯28at.com

.method public hidebysig static     void Main (        string[] args    ) cil managed{    IL_0009: callvirt instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>::GetEnumerator()    IL_000e: stloc.1    .try    {        IL_000f: br.s IL_001a        // loop start (head: IL_001a)            IL_0011: ldloc.1            IL_0012: callvirt instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<int32>::get_Current()            IL_0017: stloc.2            IL_0018: nop            IL_0019: nop            IL_001a: ldloc.1            IL_001b: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()            IL_0020: brtrue.s IL_0011        // end loop        IL_0022: leave.s IL_002f    } // end .try    finally    {        IL_0024: ldloc.1        IL_0025: brfalse.s IL_002e        IL_0027: ldloc.1        IL_0028: callvirt instance void [mscorlib]System.IDisposable::Dispose()        IL_002d: nop        IL_002e: endfinally    } // end handler    IL_002f: ret} // end of method Program::Main

从IL中看到了标准的get_Current,MoveNext,Dispose 还有一个try,finally,一下子多了这么多方法和关键词,不就是一个简单的foreach迭代数组嘛?至于搞的这么复杂嘛?这样在大数据下怎么快的起来?x2E28资讯网——每日最新资讯28at.com

还有一个奇葩的事,如果你仔细观察IL代码,比如这句:[mscorlib]System.Collections.Generic.IEnumerable``1<int32>::GetEnumerator(), 这个GetEnumerator前面是接口IEnumerable,正常情况下应该是具体迭代类吧,按理说应该会调用Array的GetEnumerator方法,如下所示。x2E28资讯网——每日最新资讯28at.com

[Serializable][ComVisible(true)][__DynamicallyInvokable]public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable{    [__DynamicallyInvokable]    public IEnumerator GetEnumerator()    {        int lowerBound = GetLowerBound(0);        if (Rank == 1 && lowerBound == 0)        {            return new SZArrayEnumerator(this);        }        return new ArrayEnumerator(this, lowerBound, Length);    }}

<2> 从windbg中寻找问题

IL中发现的第二个问题我特别好奇,

本文链接:http://www.28at.com/showinfo-26-12145-0.html面向接口编程,你考虑过性能吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: SpringBoot项目部署轻松变Docker,原来只需这几步!

下一篇: 数据安全之道:Java加密技术保护MySQL数据库

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top