AICon 深圳站聚焦 Agent 技术、应用与生态,大咖分享实战干货 了解详情
写点什么

C# 9 提案:模块初始化器

  • 2020-01-23
  • 本文字数:1239 字

    阅读完需:约 4 分钟

C# 9提案:模块初始化器

模块初始化器提案已经被提升到 C# 9 候选资格。它就像 C#中的静态构造函数,但不是应用于一个类,而是应用于整个程序集。


这个特性从一开始就存在于 CLR 中,但是直到现在还没有被 C#公开。根据模块初始化器提案,它将作为对静态构造函数语法的修改而公开。


[module: ModuleInitializer(typeof(MyModuleInitializer))]internal static class MyModuleInitializer{    static MyModuleInitializer()    {        // 将模块初始化器放在这里    }}
复制代码


从这个例子中可以看到,模块级属性会被标记为类名。然后,该类的静态构造函数被提升到模块初始化器级别。


这个特性可能会带来优于普通静态构造函数的性能。Mark Smeltzer 写道:


当前,运行时采用 init 锁,用于对是否已处理静态构造逻辑进行双重检查。即使向类中添加一个静态只读字段,也会立即增加该类中任何成员的每次外部使用的开销。


能够以一种有保证的、可预测的顺序运行初始化逻辑,并且在模块初始化后没有任何运行时操作,这将是一个巨大的优势。


另一个好处是模块初始化器是可预测的;其中的所有代码都是按顺序运行的。对于静态构造函数,从程序集的角度来看,它们的运行顺序是不确定的。根据客户端代码的不同,类 A 的构造函数可以在类 B 之前或之后运行。


对于上面的引文,Mark Smeltzer 在评论中进行了澄清:


模块初始化器仍然有上述的好处,但是在最初评论时,我并没有注意到.NET Core 3.0 对分层编译的一些最新改进…

.NET Core 3.0+中的分层编译解决了只读静态成员访问的问题。要了解更多信息,请查看 https://github.com/dotnet/coreclr/issues/24571#issuecomment-492401619。这个特性在.NET Core 3.0 版本已经发布。

这个特性非常棒:运行时最初会根据需要生成快速编译但不是最优的 JIT 代码,然后执行它。然后,在后台,运行时会分析上下文和 IL 代码,以确定是否可以实现更优的 JIT 解决方案。如果是,它将重新编译 IL 代码,并将低速的 JIT 路径替换为最优的 JIT 路径。当然,在实现的过程中会有一些额外的复杂性,但这是基本的思想。

对于静态类初始化器和静态只读字段初始化器,运行时将生成带有初始化锁的首遍(first pass)代码。那可以防止初始化器运行两次。该锁定还会带来运行时性能损失。因此,一旦初始化器运行一次,优化器就会生成新的经过优化的访问器代码路径,不再进行任何锁定!

再说一下,我不清楚实现细节(我可以确定,跟踪有关访问器肯定很复杂,需要在初始化之后进行优化),但净收益相当大:运行时本身自动优化掉了使用静态初始化器和静态只读字段的性能损失。


术语说明:


.NET CLR中的“模块”是一个包含 IL 代码的文件。“程序集”是由一个或多个模块组成的逻辑单元,其中一个模块被指定为头程序集。大多数.NET 语言被设计成只创建单模块/单文件程序集。因此,对大多数开发人员来说,这些术语是可以互换的。


VB中的“模块”就是 C#所称的“静态类”。


附属程序集”在某些方面类似于多模块/多文件程序集,但它是一个独立的概念。


原文链接


C# 9 Proposals: Module Initializers


2020-01-23 09:0012644

评论

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

第九周 性能优化(三)总结

蓝黑

极客大学架构师训练营

软件测试系统学习流程和常见面试题

测试人生路

软件测试

一个隐藏在方法集和方法调用中且易被忽略的小细节

Gopher指北

后端 Go 语言

数字货币将使货币政策实施更精准有效

CECBC

数字货币

Minikube-运行在笔记本上的Kubernetes集群

网管

学习 Kubernetes k8s minikube k8s入门

数字货币步伐加快,苏州将于双十二推出数字人民币红包测试

CECBC

数字人民币

字节面试数据结构与算法:B+树的删除和插入,不够详细你打我

小Q

Java MySQL 学习 面试 算法

除了类 Excel, SpreadJS 表格控件还能为系统开发带来什么价值?

葡萄城技术团队

阿里云原生中间件首次实现自研、开源、商用“三位一体”,技术飞轮效应显现

阿里巴巴云原生

阿里云 云原生 中间件

详解企业管理系统工作流配置

Marilyn

敏捷开发 工作流 软件架构

从基础设施到云原生应用,全方位解读阿里云原生新锐开源项目

阿里巴巴云原生

阿里云 开源 云原生

“人上人”大专学历,通过系统的六个学习步骤,艰难4面终砍offer,“跳进”字节跳动

Java架构追梦

Java 架构 字节跳动 面试 微服务

解读下一代网络:算力网络正从理想照进现实

华为云开发者联盟

AI 5G 网络 云技术

iOS AOP 方案的对比与思考

GrowingIO技术专栏

ios aop

架构训练营 - 第9周课后作业 - 学习总结

Pudding

LeetCode069-x的平方根-easy

书旅

数据结构 算法 Go 语言

迁移到 Atlassian Data Center 并没有您想象的那么可怕

Atlassian

负载均衡 高可用 Atlassian Jira

字节跳动内部授课课件:附图讲解MySQL底层索引结构算法实现

小Q

Java MySQL 学习 编程 面试

云原生趋势下的迁移与容灾思考

阿里巴巴云原生

云原生 迁移 容灾

为什么你的“开发速度”和“产品性能”,都比不过竞品?丨开发者必读

葡萄城技术团队

Java程序员说:世界上有三个伟大的发明【火、轮子、kafka】

Java架构师迁哥

排序与二分

落曦

开发霸总:我要让所有人知道,这个扫码组件,被你承包了

蚂蚁集团移动开发平台 mPaaS

支付宝 uniapp mPaaS

华为云MVP付健权:从机械工程师到AI开发者的华丽转身

华为云开发者联盟

AI 转型 工程师

Serverless 架构就不要服务器了?

华为云开发者联盟

云计算 Serverless 架构

披星戴月地辛苦割胶或成历史,海南胶园迎来这一“神器”!

华为云开发者联盟

云计算 大数据 IoT

上线操作规范——基础版本

程序员架构进阶

团队管理 开发流程 发布流程 规范

架构师训练营第 1 期 第 9 周作业

李循律

极客大学架构师训练营

区块链加持,鉴定溯源双保险,科技赋能茅台老酒成零售数字化标杆

CECBC

区块链 大数据 防伪溯源

第九周作业

Geek_4c1353

极客大学架构师训练营

0到1产品需求整理分析模型参考

燕陈华

产品设计 产品需求

C# 9提案:模块初始化器_编程语言_Jonathan Allen_InfoQ精选文章