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

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

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

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

一:背景

1. 缘由

在项目的性能改造中,发现很多方法签名的返回值都是采用IEnumerable接口,比如下面这段代码:n1y28资讯网——每日最新资讯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迭代天经地义,这个还能怎么优化???n1y28资讯网——每日最新资讯28at.com

<1> 从MSIL中寻找问题

首先我们尽可能把原貌还原出来,简化后的MSIL如下。n1y28资讯网——每日最新资讯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迭代数组嘛?至于搞的这么复杂嘛?这样在大数据下怎么快的起来?n1y28资讯网——每日最新资讯28at.com

还有一个奇葩的事,如果你仔细观察IL代码,比如这句:[mscorlib]System.Collections.Generic.IEnumerable``1<int32>::GetEnumerator(), 这个GetEnumerator前面是接口IEnumerable,正常情况下应该是具体迭代类吧,按理说应该会调用Array的GetEnumerator方法,如下所示。n1y28资讯网——每日最新资讯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中发现的第二个问题我特别好奇,

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

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

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

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

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 使用LLM插件从命令行访问Llama 2

    使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • .NET 程序的 GDI 句柄泄露的再反思

    .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 2023年,我眼中的字节跳动

    2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    8月1日消息,郭明錤今天在社交平台发文称,华为正在和江淮汽车合作,开发售价在100万元的问界MPV,预计在2024年第2季度量产,销量目标为上市首年交付5万辆。
  • “买真退假” 这种“羊毛”不能薅

    “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top
Baidu
map