CLR Via C#》这本书以前就粗略看过两遍,但一直都没能深入理解,而且很多内容也忘记了,现在准备重新看一遍,并将看过的部分写出来,因为写的过程也是一个加深理解的过程。本系列算是学习的一个记录吧,也可以方便以后自己查阅,如果对大家还有些帮助的话,我就很高兴了。书我是选择性的看的,所以顺序和书中的顺序可能不一样。

在上一篇《CLR Via C# 学习笔记(4) 方法 构造函数 》中讲到了一些静态构造函数方面的知识,现在也回顾一下,大概总结如下:

  • 静态构造函数是私有的(private) ,而且不能人为去修改访问修饰符。
  • 静态构造函数不应该去调用基类的静态构造函数,因为静态字段不会被继承到子类。
  • 静态构造函数在一个类型中有且仅有一个,并且是无参的。
  • 静态构造函数中只能初始化静态字段。

从上面的第一点可以知道静态构造函数都是private的,所以不能显示区进行调用,关于JIT何时会去生成调用静态构造函数的代码。存在着两种说法。通常被称为Precise和BeforeFieldInit。

l Precise方式JIT编译器生成调用的时机:首次创建类型的代码之前;访问类的非继承字段或成员代码之前。

l BeforeFieldInit方式JIT编译器生成调用的时机:在访问费继承静态字段代码之前。

这两种方式的主要区别就是选择调用静态构造函数的时机是否是确定的,Precise方式CLR会在确定的时刻调用静态构造函数,而BeforeFieldInit方式CLR可以自由选择调用静态构造函数的时机,利用这一点,CLR可以根据类型是否在程序域中加载来选择静态构造函数的调用次数,以便能生成执行更快的代码。

下面来看来个类分别展现了这两种方式

public classUserPrecise
{public static string_name = "内联赋值:oec2003";staticUserPrecise(){_name = "构造函数赋值:oec2003";}
}
public classUserBeforeFieldInit
{public static string_name = "内联赋值:oec2003";
}

通过IL代码可以看出在UserBeforeFieldInit 的元数据上有BeforeFieldInit的标记,如下图:

既然上面提到BeforeFieldInit方式CLR可以选择调用构造函数的次数从而来生成执行更快的代码,下面就写一段测试代码来看看究竟怎样。

public sealed class Program
{static void Main(string[] args){const Int32 iterations = 1000 * 1000 * 1000;Test1(iterations);Test2(iterations);}private static void Test1(Int32 iterations){Stopwatch sw = Stopwatch.StartNew();for (Int32 i = 0; i < iterations; i++){UserBeforeFieldInit._name = "oec2003";}Console.WriteLine("Test1-UserBeforeFieldInit 用时:" + sw.Elapsed);sw = Stopwatch.StartNew();for (Int32 j = 0; j < iterations; j++){UserPrecise._name = "oec2003";}Console.WriteLine("Test1-UserPrecise 用时:" + sw.Elapsed);}private static void Test2(Int32 iterations){Stopwatch sw = Stopwatch.StartNew();for (Int32 i = 0; i < iterations; i++){UserBeforeFieldInit._name = "oec2003";}Console.WriteLine("Test2-UserBeforeFieldInit 用时:" + sw.Elapsed);sw = Stopwatch.StartNew();for (Int32 j = 0; j < iterations; j++){UserPrecise._name = "oec2003";}Console.WriteLine("Test2-UserPrecise 用时:" + sw.Elapsed);}
}public class UserBeforeFieldInit
{public static string _name;
}public class UserPrecise
{public static string _name;static UserPrecise(){_name = "oec2003";}
}

测试结果如下:

从上面结果来看,BeforeFieldInit方式的执行速度还是要快很多,但为什么第二次执行时,两种方式的速度差不多呢?因为经过第一次执行后JIT编译器知道类型的构造器已经被调用了,所以第二次执行时不会显示对构造函数进行调用。

系列相关文章

CLR Via C# 学习笔记(1) 基元类型 值类型 引用类型

CLR Via C# 学习笔记(2) 装箱和拆箱

CLR Via C# 学习笔记(3) 常量和字段(cosnt readonly)

CLR Via C# 学习笔记(4) 方法 构造函数

CLR Via C# 学习笔记(5) 静态构造函数的性能

CLR Via C# 学习笔记(6) 方法参数相关(out ref params)

转载于:https://blog.51cto.com/oec2003/1043876

CLR Via C# 学习笔记(5) 静态构造函数的性能相关推荐

  1. 数字IC设计学习笔记_静态时序分析STA_ STA基本概念

    数字IC设计学习笔记 STA基本概念 1. STA基本概念 2. 时序弧概念 Timing Arc 3. 建立时间和保持时间概念 4. 时序路径概念Timing Path 5. 时钟域概念clock ...

  2. 【JVM 学习笔记 05】:JVM性能调优工具的使用和优化案例

    [JVM 学习笔记 05]:JVM性能调优工具的使用 1. 使用 jstat(命令行工具) 查看线上系统的JVM运行状况 1.1 常用命令 1.2 使用技巧 1.2.1 随着系统运行,每秒钟会在年轻代 ...

  3. kvm虚拟化学习笔记(二十一)之KVM性能优化学习笔记

    本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6. ...

  4. 数字IC设计学习笔记_静态时序分析STA_ PrimeTime 基本概述

    数字IC设计学习笔记 PrimeTime 基本概述 1. PrimeTime 基本概述 2. 运行模式 1. PrimeTime 基本概述 PrimeTime,Synopsys公司提出的,针对于复杂的 ...

  5. 数字IC设计学习笔记_静态时序分析STA_伪路径False Paths

    数字IC设计学习笔记 半周期路径Half Cycle Path 1. 伪路径False Paths 2. 如何处理False Paths 1. 伪路径False Paths 在设计中,有些路径是不可能 ...

  6. MongoDB学习笔记(四)--索引 性能优化

    索引                                                                                             基础索引 ...

  7. 图像质量评价学习笔记02:IQA模型性能评价指标(PLCC、SROCC、KROCC、RMSE)

    性能好的图像质量评价(IQA)算法,其质量评测分数会与主观质量分数高度一致,IQA 有许多评价指标,为了衡量方法测试结果与主观评价之间的一致性,视频质量专家组VQEG(Video Quality Ex ...

  8. 【C++学习笔记2】构造函数、析构函数、函数多态、抽象类、函数模板

    这次笔记介绍构造函数.析构函数.函数多态.抽象类.函数模板 一.构造函数 1.在定义对象,构造函数程序将自动执行,他的类型跟类名一致 函数声明最好放在自己的类里面,这样才符合类的封装,也可以像下面一样 ...

  9. 深度探索C++对象模型 学习笔记 第二章 构造函数语意学

    很多人抱怨说C++背着程序员做了太多事,如: if (cin) { /* ... */ } 为了让cin能转换为真假值,为cin定义一个类型转换运算符operator int(),就可以完成以上工作了 ...

最新文章

  1. 解题报告:简单瞎搞题(bitset的应用)
  2. python电脑如何下载软件-Python如何下载文件
  3. c语言ad采样程序思路,单片机AD采样程序及其寄存器讲解
  4. cocos2dX 之数据存储
  5. 容器编排技术 -- Kubernetes 为 Namespace 配置默认的内存请求与限额
  6. 又见黑科技!量子薄膜传感器或推动VR设备变革
  7. LINUX SHELL自定义函数及参数范例
  8. nodemcu固件编译
  9. 【Blender 入门系列】 02 乐高方块渲染
  10. 被发哥拉着跪向观众,朱军为何如此惊魂?
  11. Android程序员必装apk
  12. 1、cell 内容最大长度 The maximum length of cell contents (text) is 32767 characters
  13. netlink实现驱动和应用层通信
  14. PDF文档免费转成Word文档,不限页数。
  15. 最适合跑步用的耳机有哪些、精选五款最优秀的跑步耳机推荐
  16. uniapp + HbuliderX更新日志
  17. U-boot 对UEFI的支持
  18. 课后作业之Email邮箱地址注册
  19. 录屏工具Gif软件 附带源码
  20. 在进销存管理中经常提到红冲,那什么是红冲呢?

热门文章

  1. java程序员_Java和Python的区别 好程序员帮大家解读
  2. 三维数组设置索引_python3三维数据结构 —— panel
  3. oracle备份密码文件,[数据库]Oracle数据库备份dmp文件,使用cmd命令导入导出步骤,以及忘记Oracle密码_星空网...
  4. c语言求前15项中偶数项的和,偶数前n项和
  5. springcloud服务注册中心eureka搭建
  6. 如何设计销售CRM×运营CRM×社交化SCRM系统?(一)
  7. 互联网晚报 | 9月11日 星期六 | 魅蓝宣布正式回归;黑石集团终止收购SOHO中国;“小酒馆第一股”海伦司正式登陆港交所...
  8. 互联网日报 | 3月20日 星期六 | 荣耀CEO赵明谈发展目标;家乐福中国未来谋求独立上市;微盟开放接入支付宝小程序能力...
  9. “直播带货”还能火多久?
  10. java 工厂模式的写法_java简单工厂模式是什么