• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Hing
沉浸在技术的海洋,通过学习与讨论,只有不断的提高,才有可能去创造与实现.
博客园    首页    新随笔    联系   管理    订阅  订阅
CLR VIA C# 笔记一(1.4)

1.4执行程序集的代码

 

 IL是与CPU无关的机器语言,可将它视为一种面向对象的机器语言.高级语言通常只公开了CLR的所有功能的一个子集,而IL汇编语言允许开发人员访问CLR的所有功能.

 若某一高级语言隐藏了需要的CLR功能,那么可以使用IL或者其他公开了这一功能的高级语言来写.这也是CLR其中一个非常出色的特性”混合语言编程”,允许在不同编程语言之间方便地切换,同时又保持紧密集成.

CLR的“即时”编译器(just in time,JIT)会把IL编译成本地CPU指令.

方法的调用图:

 

一个方法只有在首次调用时才会造成性能损失,以后都无需重新验证IL并把它编译成本地代码,因为JIT编译器将本地CPU指令存储到了动态内存中,当应用程序终止时,代码也会被丢弃,再次运行程序需重新验证IL并编译.

JIT编译器会对本地代码进行优化,托管代码相较于非托管代码的优势:

1.              JIT编译器会判断运行在怎样的CPU上,并利用CPU支持的任何特殊指令来提升程序性能,而非托管通常是针对最小功能集合的CPU来编译的.

2.              JIT编译器会判断一个特定的测试是否在它运行的机器上总是失败,如果主机只有一个CPU,JIT编译器不会为上树代码生成任何CPU指令,本地代码将针对主机进行优化,最终代码变得更小,执行得更快.

3.              CLR可以评估代码的执行,并将IL重新编译成本地代码.

 

.NET Framework SDK 提供的NGen.exe工具可以将程序集的所有IL代码编译成本地代码,并保存到磁盘文件中.在运行时,一旦加载这个程序集,CLR会判断是否存在这个程序集的预编译版本并优先加载,这样可以避免运行时进行编译.但NGen.exe生成的代码不会像JIT编译器生成的代码那样高度优化.

posted on 2011-06-10 19:09  Pacer  阅读(483)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3