【个人笔记】CLR Via C# 第一章 CLR执行模型

本博文详细解析了公共语言运行库(CLR)的执行模型,包括托管模块、中间语言(IL)、元数据、JIT编译器及性能优化等关键概念。文章深入探讨了CLR如何通过JIT编译将中间语言转换为本地代码,从而实现高效性能。同时,文中还对比了非托管代码与托管代码在性能上的差异,提供了实用的检查和优化技巧。

第一章 CLR执行模型

热点重点

  1. 公共语言运行库(CLRCommon Language Runtime):
    1. 一个运行库
  2. 编译器:
    1. 面向CLR的编译器,能编译出托管模块。C++编译器可编译出非托管模块代码
  1. 托管模块(managed module):
    1. 是编译器编译的结果
    2. 结构:中间语言和元数据
    3. 具体结构:PE32PE32+头,CLR头,元数据,IL代码
  1. 中间语言(ILIntermediate Language):
    1. 在运行时,CLR将其编译成本地CPU指令
    2. 可理解为面向对象的机器语言
  2. 元数据(metadata):
    1. 一系列特殊的数据表,描述模块定义的内容
  3. 程序集(assembly):
    1. 一个或多个模块/资源文件的逻辑性分组。在CLR中也称为组件(component
  1. JITjust-in-time)编译器:
    1. IL转换成本地CPU指令
  1. 不安全代码:
    1. C#编译器对不安全代码打上unsafe关键字来标记
    2.  System.Security.Permissions.SecurityPermissionsFlag  = ~.SkpiVerification 时,允许执行不安全代码
    3. 可利用PEVerify.exe查看程序集中是否含有不安全代码
  2. WoW64windows on windows64)技术:
    1. 允许运行32Windows应用程序
    2. Win64Itanium用该技术运行32位程序
  3. Itanium机器:
    1. CPUIA64版本,与x64x86版本不同
    2. 拥有WoW64技术,可运行32位程序
  4. 编译器优化代码
    1. 托管程序比非托管程序的性能要


执行模型

  1. 加载程序集到内存
  2. 执行某个方法时候先查看是否已编译为本地代码。

第一次调用:调用JIT编译IL为本地代码保存在内存中。

      对程序性能造成极小的影响,并会分配动态内存。

以后的调用:直接找到内存中已经编译过的代码,而直接跳过JIT编译。

  1. 由于托管代码生成的CPU指令具有特别强的针对性,而且微软把JIT编译的消耗降到了最低最低,

所以托管代码比非托管代码性能更高

 

代码形式

运行形式

性能(相对)

 

非托管代码

静态的CPU指令

直接读取

 

托管代码

中间语言IL

CLR读取,并由JIT生成

针对性CPU指令

 


JIT编译IL为本地代码

本地代码生成器:NGen.exe。由.NET Framework配套提供。

功能:可以将IL代码编译为本地代码。

作用:

  1.  提高程序启动速度(JIT无需再编译IL代码)
  2. 减少应用程序的工作集,可以将程序集编译为IL代码,于是运行时候JIT无需再编译

缺点:

  1.  可能失去同步。如果发布了新版本的程序集,那么JIT也不会编译IL代码而是直接用NGen.exe所生成的本地代码。
  2. 没有知识产权保护。生成的本地代码脱离了原IL代码,但是运行时,CLR要求访问程序集的元数据,所以要同时发布包含IL和元数据的程序集。
  3. 执行性能差。因为不是JIT编译,所以如果移植后,不能对CPU进行针对性代码生成。
  4. 加载性能差。牵涉到内存分配,如果JIT编译的话可以动态分配,NGen.exe生成的程序集以静态方式计算内存地址引用,若windows不能再其首选基址加载程序集,则会重新定位文件




?查看电脑的.NET Framework版本

先查看是否安装了.NETFramework ,资源浏览器输入:%SystemRoot%\System32,查看存在文件 mscoree.dll,则已安装。

  1. 注册表方式

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy

  1. VS命令行方式

”VS工具命令提示的窗口中输入:CLRVer.exe -all

  1. CMD命令行方式

dir %WINDIR%\Microsoft.Net\Framework\v*

  1. 资源浏览器方式

输入:%systemroot%\Microsoft.NET\Framework


先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值