`

C#的目标

阅读更多
v通过编译和链接生成单一的本地可执行文件(.exe)的时代已经过去,在Microsoft Windows中,应用程序的执行早已演变成为基于DLL形式,而通过.NET, 我们正在向基于虚拟机的程序执行模式演化


CLR中的JIT编译器

将C#编译成中间语言,然后中间语言由CLR执行。CLI标准中定义了中间语言的规范。我们可以把第1章的“Hello World!”程序加载到.NET SDK提供的中间语言反汇编器(Intermediate Language Disassembler,ILDASM)中,一探中间语言的究竟。ILDASM以树型视图列出程序集中的数据类型,你可以展开一个方法,查看C#编译器生成的中间语言代码。如代码清单2-1所示,中间语言很像汇编语言,实际上它就是CLR中的汇编语言。称其为中间语言是因为它是介于特定语言和特定平台之间的一个中间步骤。

代码清单2-1 HelloWorld.exe主方法中间语言

CLR不是解释器,并非每次执行的时候它都重新翻译中间语言代码。虽然解释器提供了许多灵活的方案(比如Windows脚本宿主中的JScript解释器),但它通常不是一个高效的运行时平台。实际上CLR将中间语言代码在执行之前就编译成机器码——这就是即时编译。即时编译的过程需要一些时间,但是对于程序的每个部分,它通常意味着每个进程只会受到一次性能上的影响。当代码编译完成之后,CLR下次需要时仅仅执行编译好的版本,执行速度与传统的编译好的代码一样迅速(有时甚至更快)。

虽然JIT编译阶段增加了一些复杂性,并一定程度上影响了初次运行时的性能,但是JIT编译器与CLR的优点超过了JIT编译耗费的时间,因为:

l 托管程序消耗的内存更少。通常中间语言的程序代码体积比本地代码小。换句话说,托管程序的工作集(working set)——程序消耗的内存分页——一般比本地程序小。通过一定的转化,可以将本地程序的工作集减小到托管程序的水平,但有了CLR,就不需要为此做任何工作。

l 只有被执行的中间语言代码才会被JIT编译器编译。一般来说,中间语言代码比机器码更加紧凑,所以将编译过的代码控制在最小程度,有利于减小程序所占内存的空间。

l CLR能跟踪操作频繁的调用。当某个经过JIT编译的代码段长时间没有被调用,CLR会释放其所占的空间。这段代码直到再次调用时才会重新编译。

CLR还能在程序执行时进行优化。对于本地程序,只能在编译时确定优化选项。然而当编译发生在CLR运行时中,CLR则可在任何时候执行优化。一种可能的情形是,CLR以默认方式,只使用有限的优化选项快速地编译代码。当某段代码被频繁调用,CLR可以通过更多的优化选项将它重新编译,使其执行得更加快速。例如目标平台的CPU数量或CPU体系结构的不同,CLR的效率模型也会有很大的差异。对于本地程序,无论是在运行时或者编译阶段,都必须进行更多的人工干预以适应上述情形。但有了CLR,创建多处理器性能就更为轻松了。另外,如果CLR发现一些分散在程序不同地方的代码被调用得相当频繁,CLR可以将这些代码移到内存中。这样它们处于同一组内存分页中,进而减小了分页错误的数量,并提高了程序运行中缓存的命中率。

CLR是个灵活的平台,它的优点显著地超过初次执行时JIT编译对性能的影响。本节所介绍的只是一部分原因。

分享到:
评论

相关推荐

    C# Opencvsharp+yolov3 目标识别.rar

    现在网上很少关于C#目标检测的例子,要么质量不高,需要用Py 本例子基于开源代码,改成了WINFORM应用

    C#下的目标跟踪 camShift算法

    C#下的目标跟踪 camShift算法都是在OpenCV和C++的框架下实现的,这个程序可以在.Net下运行,并且返回位置的坐标和跟踪物体的角度。

    C# OpenCvSharp Yolov8 Detect 目标检测

    C# OpenCvSharp Yolov8 Detect 目标检测 完整项目,自带模型,可直接运行 博客地址: https://lw112190.blog.csdn.net/article/details/132962855

    C#语言对 YOLOv4 目标检测算法封装

    借鉴大神代码 写了个dome采用C#语言对 YOLOv4 目标检测算法封装,将模型在实际应用系统中落地,实现模型在线远程调用 。希望对大家有所帮助

    antlr4cs:ANTLR 4的原始,高度优化的C#目标

    ANTLR 4的C#目标 入门 步骤1:安装Java(推荐) :warning: 从4.5.0-alpha003版本开始,不再需要用户安装Java运行时才能使用ANTLR 4编译.NET应用程序。但是,安装Java将大大提高代码生成过程的性能。 强烈建议使用...

    c#(.net)调用c++dll[x86与x64]

    c#项目用visual studio2013(debug是加载x86的dll,release加载的是x64的dll)在项目属性里修改编译环境 win32dll项目用visual studio2015,代码有宏定义还有注释,很全面

    C# winForm Socket局域网聊天室.zip

    语言:C# 目标框架:.Net Framework 4.6.1 文件含有.sln文件,打开即可查看源码 exe使用说明: 1.打开服务器端:ChatServer.exe 2.在不同电脑上打开多个客户端:Chatroom.exe,输入主机ip,点击Connect,即可使用 ...

    Expert C# 5.0: with the .NET 4.5 Framework

    Expert C# 5.0 is a book about getting the best from C#. It’s based on the principle that to write good, high-performance, robust applications you need to understand whats going on deep under the hood...

    基于c#的CAD二次开发目标框架选择手册

    基于c#的CAD二次开发的目标框架对应选择。错误的框架选择可能导致种种问题,因此需要去选择合适的框架才能更安全和高效的开发。

    雷达目标扫描界面模拟控件,C#实现

    C#开发,实现了模拟圆形雷达目标扫描显示界面,带余辉效果;背景、角度、圆环数量、扫描速度等参数均可设置;压缩包中含源码及应用示例;

    c#-OpenCV目标移动检测

    可以通过摄像头或加载视频,进行目标检测,简单使用

    基于OpenCv和C#的双目标定和3D视觉实现方法

    由于OpenCV是用C和C++编写的,Emgu用C#对其进行封装,允许用.Net语言来调用。 本例子利用OpenCV和C#实现双目视觉的标定,采用SGBM方法实现视差图计算和3D匹配。具体步骤如下: 一、获得相机1校准参数; 二、获得相机2...

    C# OpenCvSharp DNN 部署yolov5旋转目标检测 源码

    C# OpenCvSharp DNN 部署yolov5旋转目标检测 源码 博客地址: https://lw112190.blog.csdn.net/article/details/134972458

    【转】基于C#的多目标优化问题,其中包含各种求解的进化算法

    程序中有NSGA、NSGA2、NSGA3以及其他.相关算法实现

    antlrcs, ANTLR 3 StringTemplate 3和 StringTemplate 4的C# 端口.zip

    antlrcs, ANTLR 3 StringTemplate 3和 StringTemplate 4的C# 端口 ANTLR 3 C# 目标 这里知识库包含 3个主要项目的C# 版本,其中有些项目具有多个生成构件:ANTLR 3Antlr3: ANTLR 3的代码生成器Antlr3.Runtime: ANTLR...

    C# Onnx Yolov8-OBB 旋转目标检测 源码

    C# Onnx Yolov8-OBB 旋转目标检测 源码 博客地址:https://lw112190.blog.csdn.net/article/details/136294263

    C# Lab C# Web Forms

    实验室目标 在完成这个实验室后,您将能够: * 使用 C# 创建动态的 Web 页基于 ASP.NET Web Forms 技术 * 向 Web Form 字段添加输入验证,执行于客户端和服务器端,无需编写任何代码 实验室要求 * 您需要有一台...

    C#充值案例 c#经典案例.pdf

    C#语言的设计目标是提供一种简单、现代、通用的语言,可以用于开发Windows应用程序、Web应用程序、移动应用程序等。 using语句 在C#语言中,using语句用于导入命名空间,例如using System;。在本案例中,我们使用...

    C#语言参考-全面讲解C#基础语法

    C#的目标在于把Visual Basic的高生产力和C++本身的能力结合起来。 C#作为Microsoft Visual Studio 7.0的一部分提供给用户。除了C#以外,Visual Studio还支持Visual Basic、Visual C++和描述语言VBScript和Jscript。...

    C#动态调用DLL并对目标函数传递参数

    引用改网友的 https://download.csdn.net/download/jackeywjf/1521390 看懂后对其改进和中文注释,C#动态调用DLL并对目标函数传递参数

Global site tag (gtag.js) - Google Analytics