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#下的目标跟踪 camShift算法】 目标跟踪是计算机视觉领域的一个重要技术,它用于在连续的视频帧中定位和追踪特定对象。在C#环境下,我们可以利用OpenCV库来实现这一功能,OpenCV是一个强大的开源计算机视觉库,...
本项目是基于C#和OpenCvSharp实现的目标追踪源码,对于学习和应用目标追踪技术具有实践价值。 标题中的“C# OpenCvSharp Tracker”指的是使用C#编程语言和OpenCvSharp库来开发的目标追踪系统。OpenCvSharp是对...
C# OpenCvSharp Yolov8 Detect 目标检测 完整项目,自带模型,可直接运行 博客地址: https://lw112190.blog.csdn.net/article/details/132962855
将YOLOv4算法封装到C#中,可以使得基于.NET框架的应用程序能够利用该模型进行目标检测。这种封装通常涉及以下步骤: 1. **模型转换**:首先,需要将原始的YOLOv4模型(通常为Python的TensorFlow或PyTorch实现)转换...
在本文中,我们将深入探讨如何在C#环境中利用OpenCvSharp库和YOLOv3模型进行目标检测,以及如何将这一技术应用于Windows Forms(WinForm)应用程序。首先,让我们了解下C#、OpenCV、YOLOv3以及WinForm的基础知识。 ...
【测试通过环境】 win10 x64 vs2019 cuda11.7+cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp==4.9.0 .NET Framework4.7.2 博客地址:blog.csdn.net/FL1623863129/article/details/139303900 演示视频:...
ANTLR 4的C#目标 入门 步骤1:安装Java(推荐) :warning: 从4.5.0-alpha003版本开始,不再需要用户安装Java运行时才能使用ANTLR 4编译.NET应用程序。但是,安装Java将大大提高代码生成过程的性能。 强烈建议使用...
看到不少同仁为设置c#平台为x86发愁,因为在项目的配置属性中没有提供x86的选项,只有一个 AnyCpu。如果你在32位机上开发的项目,到了用户的64位机上运行不了,不急出一脑袋汗才怪。所以,把此技巧提供给大家很有...
在本项目中,"C# Onnx Yolov8-OBB 旋转目标检测 源码" 提供了一个使用C#编程语言实现的目标检测解决方案,它利用ONNX(Open Neural Network Exchange)框架来运行Yolov8-OBB模型,这是一种针对旋转物体检测优化的...
c#项目用visual studio2013(debug是加载x86的dll,release加载的是x64的dll)在项目属性里修改编译环境 win32dll项目用visual studio2015,代码有宏定义还有注释,很全面
开发者可以参考这些文件来搭建和测试自己的C#目标检测系统。 总之,结合C#、EMGU CV 4.6.0、Darknet和GPU,我们可以构建一个高效的目标检测应用,尤其适合实时场景,例如监控视频分析、自动驾驶等领域。通过理解并...
《Expert C# 5.0: *** 4.5 Framework》是一本专注于C#编程语言的高级教程书籍,作者为经验丰富的开发者,旨在帮助那些已经熟悉.NET框架的开发人员深入理解C#语言,并且运用这些知识编写高性能、健壮的应用程序。...
C# Onnx CenterNet目标检测 源码博客地址:https://lw112190.blog.csdn.net/article/details/134834244
本项目聚焦于使用C#编程语言实现一个雷达目标扫描界面模拟控件,这是一个能够帮助开发者构建类似雷达扫描系统的应用程序的重要工具。C#是微软开发的一种面向对象的编程语言,特别适合用于Windows桌面应用开发,它...
语言:C# 目标框架:.Net Framework 4.6.1 文件含有.sln文件,打开即可查看源码 exe使用说明: 1.打开服务器端:ChatServer.exe 2.在不同电脑上打开多个客户端:Chatroom.exe,输入主机ip,点击Connect,即可使用 ...
在本文中,我们将深入探讨如何使用C#编程语言结合OpenCvSharp库和Darknet的预训练模型Yolov5实现旋转目标检测。这个项目的关键在于利用深度神经网络(DNN)技术,使得我们能够在图像中准确地检测并识别出各种角度的...
结合OpenCV库,我们可以利用C#实现强大的计算机视觉功能,比如目标移动检测。本篇将深入探讨如何利用C#与OpenCV进行目标移动检测。 OpenCV(开源计算机视觉库)是一个跨平台的库,它包含了大量的用于处理图像和视频...
在本文中,我们将深入探讨如何使用C#编程语言结合OpenCvSharp库和深度学习框架DNN部署YOLOV6目标检测模型。YOLO(You Only Look Once)是一种高效的实时对象检测系统,而OpenCvSharp是OpenCV的C#版本,提供了丰富的...
本主题主要关注使用C#编程语言实现的多目标进化算法,包括NSGA(Non-dominated Sorting Genetic Algorithm)、NSGA2及其后续版本NSGA3。这些算法基于遗传进化理论,通过模拟自然选择和遗传过程来搜索多目标问题的...
【C# OpenVINO Yolov8-OBB 旋转目标检测 源码】是一个基于C#编程语言的项目,利用Intel的OpenVINO工具包实现了Yolov8的优化版——Yolov8-OBB(Oriented Bound Box,即带有角度信息的边界框)的目标检测算法。...