2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

.NET Core 中的去虚

  • 2017-12-24
  • 本文字数:1232 字

    阅读完需:约 4 分钟

在.NET 最初被设计出来时,方法在默认情况下必须是非虚方法。这有几个原因,其中一个是,非虚方法通常比虚方法快很多。除了虚函数表查询本身的成本之外,虚函数通常还无法内联。由于.NET 的发展趋势是倾向于使用大量的小方法,所以非内联方法的函数调用开销最终会超过方法本身的开销。我们在文章“关于 C#的抽象与 For-Each 性能”中介绍了这种内联的部分效果。

在过去的几年中,我们习惯的 C#一直在变化。以前,大接口并不常见,但现在,可以完全匹配所有类的“影子接口”都非常常见了。这始于 WCF,它鼓励这种做法,虽然不是必须的。随着 DI 框架性能的提升,在项目中见到面向所有非 DTO 类的影子接口已经很平常了。

方法去虚有多种方式,本质上讲,就是在特定的情况下把它们视为非虚方法。Java HotSpot 就以具备这项特性而闻名。在 Java 中,所有方法在默认情况下都是虚方法,因此,在 Java 的历史中,解决这种性能问题的需求出现得早很多。

在今年三月份,.NET Core 悄悄地对“去虚(Devirtualization)”发起了挑战。简单去虚特性处理了三种基本的场景:

  • 在 sealed 类上调用虚方法;
  • 在 sealed 方法上调用虚方法;
  • 在明确知道类型的情况下调用虚方法(例如,紧挨着构造函数)。

接口去虚也有一些基础的支持,但有限制。例如:

如果方法是 final 的,而类不明确或者不是 final 的,则不允许接口去虚,因为派生类在实现接口时还可以重写 final 方法。

需要注意的是,仅仅将类标记为“sealed”是不足以从去虚接口受益的。如果你正在使用 DI 框架隐藏运行时使用了哪个具体类,那么 JIT 编译器可能无法确定使用了什么类型。

这在 Java 中之所以不是问题,是因为 Java 去虚技术的工作原理完全不同。它是根据运行时指标试探性地去虚接口调用,对最常调用的方法重新即时编译。其中还包含了专门的防卫语句,以防具体的类型修改和去虚需要解除。

展望

.NET Core 2.0 提供了上述特性,但还有许多工作要做。下面是去虚路线图上的部分重点工作。

众所周知,在涉及接口调用时,结构很糟糕,因为它们不仅是虚的,而且还需要对值进行装箱。因此,有几项工作是为了尽可能地减少虚调用和装箱。其中一个重要的部分是一类结构,这是一个高级JIT 概念,超出了本报道的范围。

JIT 本身的类型跟踪改进。显然,在许多情况下,JIT 在一个地方知道具体的类型,但无法将信息传递下去,因此,JIT 不得不采用更通用的机器代码。

试探性去虚也在考虑范围。根据概述,该特性不会和 Java 里的一样。更准确地说,它会根据 JIT 过程中已知的覆写清单做决定。(据推测,这会用在接口只有单个类实现的情况下,这在上文提到的 DI 场景下经常发生。)

其中有一种特殊情况,就是 EqualityComparer.Default防卫去虚。由于在绝大多数情况下,IEqualityComparer 调用都会指向默认实现(视情况不同,要么是IEquatable,要么是Object.Equals),所以他们觉得,如果不减慢使用非默认IEqualityComparer 的情况,那么提升使用默认实现场景的执行速度是值得的。

查看英文原文 Devirtualization in .NET Core

2017-12-24 18:002402
用户头像

发布了 1008 篇内容, 共 442.9 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

基于Pytorch Gemotric在昇腾上实现GAT图神经网络

永荣带你玩转昇腾

HarmonyNEXT手动申请权限以及使用系统控件获取地址坐标的案例(区别)

九九花开

前端 鸿蒙5.0 HarmonyNEXT5.0 鸿蒙地理坐标获取 HarmonyOSNEXT权限申请

鸿蒙版《智慧农业APP》通过华为云IoT平台实现软件硬件互联

九九花开

物联网 华为云IoT平台 鸿蒙5.0 HarmonyOS NEXT

【HarmonyOS 5】多目标产物构建实践

深海的鲸同学 luvi

鸿蒙 HarmonyOS DevEco Studio HarmonyOS SDK应用服务

Amoro + Flink CDC 数据融合入湖新体验

Apache Flink

大数据 flink 实时计算 Flink CDC

【等保知识】过等保单位如何选择备案地?新政策依据是什么?

行云管家

等保 等级保护 等保测评

利用生成式 AI 加速应用程序 Operational Readiness Review(ORR)流程

亚马逊云科技 (Amazon Web Services)

5月27日截止 | Volcano社区2025夏季LFX Mentorship欢迎你的加入

华为云原生团队

云计算 容器 云原生

网易伏羲亮相YEF2025大会:聚焦AI创新,CCF-网易雷火联合基金二期申报延长

网易伏羲

人机协作 网易伏羲 网易雷火 网易有灵

淘天集团多项最新AI技术成果亮相TongAI大会,三篇论文入选Poster展示

新消费日报

MCP+A2A协议如何推动AI智能体进化为超级分布式网络

测试人

人工智能 软件测试

有哪些类似于jobleap.cn的职业发展相关平台

Y11

求职 找工作 就业 失业

信创 CDC 实战 | OGG、Attunity……之后,信创数据库实时同步链路如何构建?(以 GaussDB 数据入仓为例)

tapdata

GaussDB 实时同步 StarRocks 实时数仓 Doris 实时同步 数据同步方案 TapData 数据集成

webgl技术在3D展示中的应用

北京木奇移动技术有限公司

软件外包公司 webgl技术 3D展示

【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(4)

HarmonyOS SDK

harmoyos

《算法导论(第4版)》阅读笔记:p134-p155

codists

算法

零售企业库存管理的下一步发展需要打破孤岛

第七在线

案例解读:CST如何直接导入弯折后的PCB

思茂信息

cst CST软件 CST Studio Suite

昇腾910-PyTorch 实现 图神经网络GraphSage

永荣带你玩转昇腾

StarRocks+Paimon落地阿里日志采集:万亿级实时数据秒级查询

StarRocks

flink OLAP StarRocks paimon Checkpoin

开源鸿蒙智能手表生态暨新品发布:开启穿戴产业新纪元

极客天地

国产CPU品牌汇总以及作用简单介绍

行云管家

信创 国产化

技术平权时代:灯塔低代码平台如何用CRM搭建,托起千万中小企业的星辰大海

中烟创新

【华为云MySQL技术专栏】TaurusDB存算分离,SAL组件的妙用

华为云开发者联盟

2025深圳搞钱地图:按这张图找工作,房租少付1/3,工资多拿50%

测试人

人工智能 软件测试 内推

Taro on Harmony C-API 版本正式开源

京东零售技术

关于OT & IIOT系统远程访问的零信任安全

权说安全

数据安全;工业互联网 零信任

重磅预告!《AI融合高等教育白皮书》即将发布,专家集聚解读先行探索,邀您共同见证

ModelWhale

人工智能 AI+学科白皮书 人工智能通识教育 人工智能教育

.NET Core中的去虚_.NET_Jonathan Allen_InfoQ精选文章